Visual C++6 MFC MapViewOfFile возвращает код ошибки 8

У меня есть программа, которая создает файл карты, она может нормально выполнять этот вызов, m_hMap = CreateFileMapping(m_hFile,0,dwProtect,0,m_dwMapSize,NULL);, но когда последующий вызов функции MapViewOfFile(m_hMap,dwViewAccess,0,0,0), я получаю код ошибки 8, то есть ERROR_NOT_ENOUGH_MEMORY, или строку ошибки "ошибка недостаточно память доступна для обработки этой команды".

Поэтому я не совсем понимаю, что для меня делает MapViewOfFile и как исправить ситуацию.

какие-то цифры...

m_dwMapSize = 453427200
dwProtect = PAGE_READWRITE;
dwViewAccess = FILE_MAP_ALL_ACCESS;

Я думаю, что размер моей страницы 65536


person nagates    schedule 22.03.2013    source источник
comment
Насколько велик файл, который вы пытаетесь сопоставить?   -  person Tomdarkness    schedule 22.03.2013
comment
Я предполагаю, что вы собираетесь отображать только первые ~ 432 МБ файла, верно? В любом случае, достаточно ли в вашем процессе виртуальной памяти для сопоставления файла? Ограничение по умолчанию составляет 2 ГБ для 32-битных окон.   -  person Tomdarkness    schedule 22.03.2013
comment
Что ж, похоже, что создается и уничтожается представление памяти, а также увеличивается по мере необходимости. Меня не сильно удивит, если он попытается в конечном итоге загрузить все это в память.   -  person nagates    schedule 22.03.2013


Ответы (1)


В случае очень большого файла и для его чтения рекомендуется читать его небольшими частями, а затем обрабатывать каждую часть. А функция MapViewOfFile используется для отображения фрагмента в памяти.

Посмотрите на http://msdn.microsoft.com/en-us/library/windows/desktop/aa366761(v=vs.85).aspx необходимо смещение, чтобы правильно выполнять свою работу, т. е. в случае, если вы хотите прочитать очень большой файл по частям. В основном из-за фрагментации и связанных с этим причин очень большой запрос памяти не выполняется.

person Saqlain    schedule 22.03.2013
comment
так что же такое m_hMap = CreateFileMapping(m_hFile,0,dwProtect,0,m_dwMapSize,NULL); делает? Не выделяет память? - person nagates; 22.03.2013
comment
Вы можете представить MapViewOfFile как malloc+memcpy файла, который вы открываете, не более того (внутри все наоборот: malloc может использовать slab-карту памяти). Таким образом, MapViewOfFile обычно просто выбирает адрес, по которому он может непрерывно помещать байты представления файла в памяти. - person Saqlain; 23.03.2013