mmap - prot_read - ¿Qué tan grande puede ser un archivo mapeado en memoria?
mmap python (7)
Bajo Windows: "El tamaño de la vista de un archivo está limitado al mayor bloque contiguo disponible de memoria virtual no reservada. Esto es como máximo 2 GB menos la memoria virtual ya reservada por el proceso".
Desde MDSN .
No estoy seguro de LINUX / OSX / Whatever Else, pero probablemente también esté relacionado con el espacio de direcciones.
¿Qué limita el tamaño de un archivo asignado en memoria? Sé que no puede ser más grande que la mayor parte continua de espacio de direcciones sin asignar, y que debería haber suficiente espacio libre en el disco. Pero ¿hay otros límites?
Con FUSE en linux también podría crear un sistema de archivos en memoria que se extienda al disco a pedido. No estoy seguro de que califique como memoria mapeada, y la distinción se vuelve borrosa.
Entrada de Wikipedia sobre el tema: http://en.wikipedia.org/wiki/Memory-mapped_file
Esta ha sido mi experiencia al usar archivos asignados en memoria en Win32:
Si asigna el archivo completo en un segmento, normalmente se extrae alrededor de 750 MB, porque no puede encontrar un bloque contiguo de memoria más grande. Si lo divide en segmentos más pequeños, digamos 100MB cada uno, puede obtener alrededor de 1500MB-1800MB dependiendo de lo que se esté ejecutando.
Si usa el conmutador / 3g , puede obtener más de 2 GB hasta aproximadamente 2700 MB, pero el rendimiento del sistema operativo está penalizado.
No estoy seguro acerca de los 64 bits, nunca lo he intentado, pero supongo que el tamaño máximo de archivo solo estará limitado por la cantidad de memoria física que tenga.
No debe haber otros límites. ¿No son suficientes? ;-)
Sí, hay límites para los archivos asignados en memoria. Lo más sorprendente es:
Los archivos asignados en memoria no pueden tener más de 2 GB en sistemas de 32 bits.
Cuando un memmap hace que un archivo se cree o se extienda más allá de su tamaño actual en el sistema de archivos, el contenido de la nueva parte no se especifica. En sistemas con semántica de sistema de archivos POSIX, la parte extendida se llenará con cero bytes.
Incluso en mi sistema de memoria RAM de 32 bits y 32 GB, recibo el siguiente error si trato de leer en un archivo de gran cantidad de mapas asignados en memoria en lugar de tomar porciones de él usando compensaciones de bytes:
Overflow Error: memory mapped size must be positive
Los grandes conjuntos de datos son realmente un dolor trabajar con ellos.
Estás siendo demasiado conservador: un archivo asignado en memoria puede ser más grande que el espacio de direcciones. La vista del archivo asignado en memoria está limitada por las restricciones de memoria del sistema operativo, pero esa es solo la parte del archivo que está viendo al mismo tiempo. (Y supongo que, técnicamente, podría asignar varias vistas de partes discontinuas del archivo a la vez, por lo que, aparte de las restricciones de sobrecarga y de longitud de la página, solo el número total de bytes es lo que plantea un límite. [0 a 1024] y bytes [2 40 a 2 40 + 1024] con dos vistas separadas.)
En MS Windows, mire la función MapViewOfFile . Efectivamente toma un desplazamiento de archivo de 64 bits y una longitud de 32 bits.