Necesito leer (escanear) un archivo secuencialmente y procesar su contenido. El tamaño del archivo puede ser desde muy pequeño (algunos KB) hasta muy grande (algunos GB).Rendimiento de archivos mapeados en memoria Win32 vs. CRT fopen/fread
probé dos técnicas que utilizan VC10/VS2010 en Windows 7 de 64 bits:
- memoria Win32 archivos de mapeado (es decir CreateFile, CreateFileMapping, MapViewOfFile, etc.)
- fopen y fread de CRT.
Pensé que la técnica de archivo de memoria asignada podría ser más rápida que las funciones de CRT, pero algunas pruebas mostraron que la velocidad es casi la misma en ambos casos.
Las siguientes declaraciones de C++ se utilizan para 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
);
El archivo se lee de forma secuencial, pedazo a pedazo; cada fragmento tiene un tamaño de SYSTEM_INFO.dwAllocationGranularity
.
Considerando que la velocidad es casi la misma con MMF y CRT, usaría las funciones CRT porque son más simples y multiplataforma. Pero tengo curiosidad: ¿estoy usando la técnica de MMF correctamente? ¿Es normal que el rendimiento de MMF en este caso de archivo scannig secuencialmente sea el mismo que el de CRT uno?
Gracias.
¿Por qué MMF alguna vez pondría algo en el archivo de paginación? Las páginas MMF están respaldadas por el archivo de datos abierto, no por el archivo de paginación. –
Estoy de acuerdo con Ben. Copiar en el archivo de la página parece improbable. – Joe
Sí, el archivo de paginación se evita explícitamente mediante el uso de MMF. http://blogs.msdn.com/b/khen1234/archive/2006/01/30/519483.aspx Pero tenga en cuenta el problema "Al asignar grandes archivos a la memoria virtual para realizar E/S en ellos, tenga en cuenta el hecho que cada dirección que quemas en la memoria virtual es otra que no puede ser utilizada por tu aplicación. Por lo general, es más eficiente usar rutinas de E/S de archivos regulares para realizar operaciones de lectura/escritura en archivos de gran tamaño ". –