2010-10-20 10 views
13

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:

  1. memoria Win32 archivos de mapeado (es decir CreateFile, CreateFileMapping, MapViewOfFile, etc.)
  2. 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.

Respuesta

14

Creo que no verá mucha diferencia si accede al archivo secuencialmente. Debido a que la E/S de archivo está muy almacenada en caché, probablemente también se use + lectura anticipada.

La cosa sería diferente si tuviera muchos "saltos" durante el procesamiento de datos del archivo. Entonces, cada vez que establezca un nuevo puntero de archivo y lea una nueva porción de archivo probablemente matará CRT, mientras que MMF le dará el máximo rendimiento posible

4

Dado que está escaneando el archivo secuencialmente, no esperaba que el patrón de uso del disco fuera demasiado diferente para cualquiera de los métodos.

Para archivos grandes, MMF puede reducir la ubicación de datos e incluso dar como resultado una copia de todo o parte del archivo en el archivo de paginación, mientras que el procesamiento a través de CRT usando un pequeño búfer se realizará en RAM. En este caso, MMF probablemente sea más lento. Puede mitigar esto haciendo solo un mapeo en una parte del archivo subyacente a la vez, pero luego las cosas se vuelven más complejas sin una ganancia probable sobre la E/S secuencial directa.

Los MMF son realmente la manera en que Windows implementa la memoria compartida entre procesos, en lugar de una forma de acelerar la E/S de archivos generalizada. La caché del administrador de archivos en el kernel es lo que realmente necesita aprovechar aquí.

+4

¿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. –

+0

Estoy de acuerdo con Ben. Copiar en el archivo de la página parece improbable. – Joe

+0

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 ". –

1

Ambos métodos llegarán al disco i/o, que será su cuello de botella. Me gustaría ir con un método que le gusta más a mi funcionalidad de nivel superior: si necesito transmisión, iré con los archivos; si necesito acceso secuencial y archivos de tamaño fijo, consideraría los archivos mapeados en memoria.

O, en el caso de que tenga un algoritmo que solo funcione en la memoria, entonces los archivos mem-mapped pueden salir más fácilmente.

2

pensé que la memoria asignada archivo técnica podría ser más rápido que CRT funciones, pero algunas pruebas mostraron que la velocidad es casi la misma en ambos casos .

Probablemente esté presionando el caché del sistema de archivos para sus pruebas. A menos que cree explícitamente identificadores de archivo para eludir la memoria caché del sistema de archivos (FILE_FLAG_NO_BUFFERING al llamar al CreateFile), la memoria caché del sistema de archivos se activará y conservará los archivos recientemente accedidos en la memoria.

Hay una pequeña diferencia de velocidad entre leer un archivo que está en la caché del sistema de archivos con el almacenamiento en búfer activado, ya que el sistema operativo tiene que realizar una copia adicional, así como la sobrecarga de llamadas del sistema. Pero para sus propósitos, probablemente debería quedarse con las funciones de archivo CRT.

Gustavo Duarte has a great article on memory mapped files (desde una perspectiva genérica del sistema operativo).

Cuestiones relacionadas