Estoy tratando de optimizar el manejo de grandes conjuntos de datos usando mmap. Un conjunto de datos está en el rango de gigabytes. La idea era mapear todo el archivo en la memoria, lo que permite que varios procesos funcionen simultáneamente en el conjunto de datos (solo lectura). Sin embargo, no está funcionando como se esperaba.Linux/perl mmap performance
Como una simple prueba simplemente mmap el archivo (utilizando el módulo Sys :: Mmap de perl, usando el sub "mmap" que creo que se asigna directamente a la función C subyacente) y hago que el proceso duerma. Al hacer esto, el código pasa más de un minuto antes de que regrese de la llamada mmap, a pesar de esta prueba que no hace nada, ni siquiera una lectura, del archivo mmap.
Adivinando, tal vez Linux requirió que se leyera todo el archivo cuando se mmap'ed por primera vez, así que después de que el archivo se mapeó en el primer proceso (mientras dormía), invoqué una prueba simple en otro proceso que intenté leer los primeros megabytes del archivo.
Sorprendentemente, parece que el segundo proceso también pasa mucho tiempo antes de regresar de la llamada mmap, casi al mismo tiempo que mmap'ing el archivo la primera vez.
Me he asegurado de que se utiliza MAP_SHARED y de que el proceso que asignó el archivo por primera vez todavía está activo (que no ha terminado y que el mapa no se ha desasignado).
Esperaba que un archivo mmapped me permitiera dar a los procesos múltiples de trabajo un acceso aleatorio efectivo al archivo grande, pero si cada llamada mmap requiere leer todo el archivo primero, es un poco más difícil. No he probado utilizando procesos de larga ejecución para ver si el acceso es rápido después de la primera demora, pero esperaba usar MAP_SHARED y otro proceso separado sería suficiente.
Mi teoría era que mmap regresaría más o menos de inmediato, y que linux cargaría los bloques más o menos según demanda, pero el comportamiento que estoy viendo es el opuesto, lo que indica que es necesario leer todo el archivo en cada llama a mmap
¿Alguna idea de lo que estoy haciendo mal, o si he entendido mal cómo se supone que mmap funciona?
+1 para dar seguimiento con una explicación detallada. – RichieHindle
Utilice la forma 3 arg de abrir(). –