2013-03-22 594 views
0

我有一個程序正在創建一個映射文件,它能夠做到這一點很好,m_hMap = CreateFileMapping(m_hFile,0,dwProtect,0,m_dwMapSize,NULL);,但是當後續函數調用到MapViewOfFile(m_hMap,dwViewAccess,0,0,0)時,我得到一個錯誤代碼8,這是ERROR_NOT_ENOUGH_MEMORY,或錯誤字符串「錯誤沒有足夠的存儲可用於處理此命令」。Visual C++ 6 MFC MapViewOfFile返回錯誤代碼8

所以我不完全理解MapViewOfFile爲我做了什麼,以及如何解決這種情況。

一些數字...

m_dwMapSize = 453427200 
dwProtect = PAGE_READWRITE; 
dwViewAccess = FILE_MAP_ALL_ACCESS; 

我想我的頁面szie是65536或2^16

+0

您試圖映射的文件有多大? – Tomdarkness 2013-03-22 15:14:09

+0

大約500MB – nagates 2013-03-22 15:15:27

+0

我假設你打算只映射第一個〜432MB的文件,對吧?無論如何,你的過程是否有足夠的虛擬內存來映射文件?默認情況下,32bit窗口的限制爲2GB。 – Tomdarkness 2013-03-22 15:23:06

回答

0

在非常大的文件的情況下,並讀它,建議小讀它然後處理每件作品。 MapViewOfFile函數用於映射內存中的一塊。

請看http://msdn.microsoft.com/en-us/library/windows/desktop/aa366761(v=vs.85).aspx需要偏移才能正常地完成它的工作,也就是說,如果你想要分段讀取非常大的文件。主要由於碎片和相關原因,非常大的內存請求失敗。

+0

那麼什麼是m_hMap = CreateFileMapping(m_hFile,0,dwProtect,0,m_dwMapSize,NULL);在做什麼?是不是分配內存? – nagates 2013-03-22 15:54:01

+0

您可以將MapViewOfFile想象爲您正在打開的文件的malloc + memcpy,僅此而已(下面是反過來:malloc可以使用slab內存映射)。所以MapViewOfFile通常只是選擇一個地址,它可以在文件視圖的字節中連續存儲。 – Saqlain 2013-03-23 16:13:40