Мне нужно читать (сканировать) файл последовательно и обрабатывать его содержимое. Размер файла может быть от очень маленького (несколько КБ) до очень большого (несколько ГБ).
Я попробовал два метода с использованием VC10/VS2010 на 64-разрядной версии Windows 7:
- Отображаемые файлы памяти Win32 (т.е. CreateFile, CreateFileMapping, MapViewOfFile и т.д.).
- fopen и fread из CRT.
Я думал, что способ отображения файлов с памятью может быть быстрее, чем функции CRT, но некоторые тесты показали, что скорость почти одинакова в обоих случаях.
Для 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 в этом случае файла scannig последовательно совпадает с CRT?
Спасибо.