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
Предполагам, че възнамерявате да картографирате само първите ~432MB от файла, нали? Както и да е, вашият процес има ли достатъчно налична виртуална памет за картографиране на файла? Ограничението по подразбиране е 2 GB за 32-битови Windows.   -  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