我需要依次讀取(掃描)文件並處理其內容。 文件大小可以是從非常小(一些KB)到非常大(一些GB)的任何東西。Win32內存映射文件與CRT fopen/fread的性能
我嘗試使用VC10/VS2010兩種技術在Windows 7 64位:
- 的Win32存儲器映射文件(即的CreateFile,的CreateFileMapping,MapViewOfFile等)
- 的fopen和的fread從CRT。
我認爲內存映射文件技術可能比CRT功能更快,但是一些測試表明在這兩種情況下速度幾乎相同。
以下C++語句被用於MMF:
HANDLE hFile = CreateFile(
filename,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL
);
HANDLE hFileMapping = CreateFileMapping(
hFile,
NULL,
PAGE_READONLY,
0,
0,
NULL
);
文件被順序地讀出,由大塊大塊;每個塊大小爲SYSTEM_INFO.dwAllocationGranularity
。
考慮到速度幾乎與MMF和CRT一樣,我會使用CRT函數,因爲它們更簡單和多平臺。但我很好奇:我是否正確使用MMF技術?這種情況下scannig文件中的MMF性能是否與CRT相同?
謝謝。
爲什麼MMF會把東西放在頁面文件中? MMF頁面由打開的數據文件支持,而不是頁面文件。 – 2012-02-23 23:14:32
我同意本。複製到頁面文件似乎不太可能。 – Joe 2014-03-25 01:41:41
是的,通過使用MMF明確避免了頁面文件。 http://blogs.msdn.com/b/khen1234/archive/2006/01/30/519483.aspx但請注意這個問題:「在將大文件映射到虛擬內存以對它們執行I/O時,請注意事實您在虛擬內存中刻錄的每個地址都是您的應用程序無法使用的地址,通常使用常規文件I/O例程在大型文件上執行讀取/寫入操作效率更高。「 – 2015-02-23 04:52:56