Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 13

Выделение большого объема памяти

21.12.2015, 22:35. Показов 2083. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
необходимо открыть большой файл (около 1 гб) и разместить его в памяти. Какой функция выделить память? globalalloc выдает ошибку.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.12.2015, 22:35
Ответы с готовыми решениями:

Определение объема оперативной памяти
Всем привет! Пытаюсь определить объем оперативной памяти, но функции e820h и e801h прерывания int 15h возвращают в ah 86. CSEG...

Определение объема оперативной памяти
Написал не хитрый код для определения объема оперативной памяти (В реальном режиме).. Но результат не совсем верный. По идеи 32х...

MASM, выделение памяти и заполнение ее символами
Приветствую, народ! Есть задачка простая, которую надо написать на ассемблере (masm) для ОС MS-DOS: освободит лишнюю память, потребует у...

14
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
23.12.2015, 11:05
VirtualAlloc или как вариант проекция файла в память.
0
0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 13
23.12.2015, 22:04  [ТС]
C virtualalloc понятно. Спасибо. А проекция файла в память - это как?
0
0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 13
11.04.2016, 20:39  [ТС]
С Virtualallock тот же эффект. Файл больше 500 мб не открывается.
0
Terminator of naked apes
 Аватар для KyberMax
832 / 139 / 34
Регистрация: 13.02.2015
Сообщений: 328
11.04.2016, 21:23
Цитата Сообщение от shrajk Посмотреть сообщение
А проекция файла в память - это как?
File Mapping, например ;о)
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
12.04.2016, 08:54
Вообще все зависит от конкретного процесса, точнее от фрагментации. Если его адресное пространство забито загруженными dll-ками, то может и 500МБ выделить не поучится. У меня получилось выделить 1200 МБ одним куском.

Для решения данной проблемы нужно загружать программу в отладчике, смотреть ее карту памяти, какие ddl-ки куда грузятся. Если это ваши dll, менять их адреса загрузки поближе к 0x70000000.
Миниатюры
Выделение большого объема памяти  
0
0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 13
12.04.2016, 09:07  [ТС]
Да спасибо за ответ. Но вот тут второй вопрос. Суть задачи. открыть большой файл. сделать определенные действия с ним. и сохранить в другой файл. программа перестает работать и выделять нужный объем памяти если я начинаю использовать функцию GetOpenFileName. Сама функция выполняется корректно. но после нее ни globalalloc ни virtualalloc не могут выделить больше 200-300 мб памяти. если я функцию не использую, а просто в исходник прописываю название открываемого файла. то выделяется спокойно и 1 ГБ. И еще, если использую функцию GetOpenFileName Olly вываливается из отладки на этой функции. Но функцию использовать надо. или как-то ее заменить.
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
12.04.2016, 09:16
shrajk,
не видеть фрагмент обсуждаемой программы -- это гадание на кофейной жиже, но скорее всего неправильно заполнена структура, которую ты передаешь GetOpenFileName
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
12.04.2016, 10:16
ИМХО, при вызове GetOpenFileName загружается over 9000 dll и не остается больших незанятых участков памяти (см. рисунки до и после вызова). Я бы в самом начале программы зарезервировал нужный диапазон при помощи той же VirtualAlloc, но с флагом MEM_RESERVE, чтобы в эти адреса ничто не влезло, а потом уже выделял, когда нужно.
Миниатюры
Выделение большого объема памяти   Выделение большого объема памяти  
0
0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 13
12.04.2016, 10:23  [ТС]
Спасибо за ответы. вечером скину точный код. У меня у самого есть подозрение по поводу заполнения структуры ofn. Но скажу честно я нигде толком не нашел нормального объяснения как ее заполнять. скорее противоречивые ответы.
По поводу резервирования памяти до вызова функции, идея хорошая. я ее попробую. Просто однозначно с ней какая-то проблема, сжирает все непрерывные участки памяти. Может кто посоветует чем ее заменить? писать свою функцию как-то влом)
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
12.04.2016, 10:25
У меня тоже сжирает, но вроде все правильно заполнено.
Может кто посоветует чем ее заменить?
Только свои костыли.
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
12.04.2016, 10:28
Цитата Сообщение от shrajk Посмотреть сообщение
Но скажу честно я нигде толком не нашел нормального объяснения как ее заполнять. скорее противоречивые ответы.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
    ZeroMemory( &ofn , sizeof( ofn));
    ofn.lStructSize = sizeof ( ofn );
    ofn.hwndOwner = NULL  ;
    ofn.lpstrFile = szFile ;
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof( szFile );
    ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
    ofn.nFilterIndex =1;
    ofn.lpstrFileTitle = NULL ;
    ofn.nMaxFileTitle = 0 ;
    ofn.lpstrInitialDir=NULL ;
    ofn.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST
0
0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 13
12.04.2016, 10:37  [ТС]
например hwndowner советуют не NULL а дескриптор основного окна.
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
12.04.2016, 10:45
shrajk,
окно диалога можно выдавать и не создавая основное окно, например как в https://www.cyberforum.ru/asse... 51124.html https://www.cyberforum.ru/cgi-bin/latex.cgi?\to "Win32 API. Урок 36c. Нормальный проигрыватель AVI-файлов"
0
0 / 0 / 0
Регистрация: 22.09.2015
Сообщений: 13
17.04.2016, 18:01  [ТС]
Вот текст программы. написан на fasm
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
      .open:
 
        invoke  GetOpenFileName,ofn
        invoke  CreateFile,buffer,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL
        mov     [hfile],eax
        invoke  GetFileSize,[hfile],NULL
        mov     [filesize],eax
        inc       eax
        mov     [memsize],eax
        invoke  GlobalAlloc,GMEM_ZEROINIT OR GMEM_MOVEABLE,[memsize]
        mov     [hmem],eax
        invoke  GlobalLock,[hmem]
        mov     [hmemory],eax
        invoke  ReadFile, [hfile],[hmemory],[filesize],kolwrbait,NULL
        invoke  CloseHandle, [hfile]
        invoke  GetSaveFileName,ofn1
        invoke  CreateFile,buffer1,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,NULL
        mov     [hfile],eax
        xor     eax,eax
        mov     [kolwrbait],eax
        invoke  WriteFile, [hfile],[hmemory],[filesize],kolwrbait,NULL
        invoke  CloseHandle, [hfile]
        invoke  GlobalUnlock,[hmem]
        invoke  GlobalFree,[hmem]
        jmp     .finish
 
 
  filesize  dd ?
  memsize   dd ?
  hmem      dd ?
  hmemory   dd ?
  kolwrbait dd ?
  buffer rb MAXSIZE
  buffer1 rb MAXSIZE
 
  filter_string db 'All Files',0,'*.*',0
                db 'Text Files',0,'*.txt',0,0
 
  hfile     dd ?
  edithwnd  dd ?
  editfont  dd ?
  memfreesize  dd 800000000
 
 
  wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class
  msg MSG
  client RECT
 
  ofn OPENFILENAME sizeof.OPENFILENAME,0,0,filter_string,0,0,0,buffer,MAXSIZE,0,0,0,0,OFN_EXPLORER or OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST,0,0,0,0,0,0
  ofn1 OPENFILENAME sizeof.OPENFILENAME,0,0,filter_string,0,0,0,buffer1,MAXSIZE,0,0,0,0,OFN_EXPLORER or OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST,0,0,0,0,0,0
программа должна открыть файл, записать его в файл и переписать его в другой. работает только с файлами до 200-300 мб. Файлы большего размера не копируются.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.04.2016, 18:01
Помогаю со студенческими работами здесь

Выделение большого объема памяти
Надо выделить 250,000,000 байт. Делаю char m; Вылетает с ошибкой сегментации (SIGSEGV). Система - Arch linux, компилятор - g++. Подскажите,...

Выделение большого объема памяти ExAllocatePool
Добрый вечер, Пытаюсь выделить память методом ExAllocatePool (PagedPool) для использования далее в функции ZwReadFile, но выделение...

Выделение большого объема оперативной памяти
Необходимо выделить много памяти под массивы (динамически). Памяти в железе 8 Гб. Свободно 4 Гб при тестировании программы. Выделяю массив...

Запрос на выделение объема памяти, превышающего 65 000 байт
Собственно при открытии документа всплывает окно ошибки с таким текстом Сервер 6, клиенты 6 и 7.

Выделение памяти (CodeGear RAD Studio 2009 - C++ builder). Выделение памяти - консоль vs SDIApp
Есть определенный класс - длинная арифметика. Не идеальный - хранение данных исполнено в виде динамического массива типа short int, каждая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru