我需要按顺序读取(扫描)文件并处理其内容。文件的大小可以是从几KB到几GB的任何值。
我尝试了两种在Windows 7 64位上使用VC10/VS2010的技术:
- Win32内存映射文件(例如CreateFile、CreateFileMapping、MapViewOfFile等)
- CRT中的fopen和fread。
我认为内存映射文件技术可能比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技术?在这种情况下,MMF在连续扫描文件时的性能与CRT相同,这正常吗?
谢谢。