2009-04-07 35 views
23

¿Qué limita el tamaño de un archivo mapeado en memoria? Sé que no puede ser más grande que el fragmento continuo más grande de espacio de direcciones no asignado, y que debe haber suficiente espacio libre en el disco. ¿Pero hay otros límites?¿Qué tan grande puede ser un archivo mapeado en memoria?

+0

Plataforma? Windows o Linux? –

Respuesta

24

Está siendo demasiado conservador: un archivo mapeado en memoria puede ser más grande que el espacio de direcciones. La vista del archivo mapeado en memoria está limitada por las limitaciones de memoria del sistema operativo, pero esa es solo la parte del archivo que está viendo a la vez. (Y supongo que técnicamente podría mapear múltiples vistas de partes discontinuas del archivo a la vez, por lo tanto, aparte de las restricciones generales y de longitud de página, solo el número total de bytes que está mirando tiene un límite. Podría mirar los bytes. [de 0 a 1024] y bytes [2 a 2 + 1024] con dos vistas separadas.)

en MS Windows, observar la función MapViewOfFile. Efectivamente toma un desplazamiento de archivo de 64 bits y una longitud de 32 bits.

+0

Sí, debería haber dicho "ver". Necesito tener acceso al archivo completo al mismo tiempo, sin remapear() ing. – user88185

+0

MapViewOfFile toma una longitud de 64 bits en una máquina de 64 bits – springy76

+0

y de todos modos uno puede pasar CERO para un tamaño que significa "tan grande como el archivo es" –

1

No debe haber otros límites. ¿No son suficientes? ;-)

+0

En un sistema operativo de 64 bits, estos límites parecen bastante laxos ... – user88185

1

En Windows: "El tamaño de una vista de archivo está limitado al bloque contiguo más grande disponible de la memoria virtual sin reservas Esto es como máximo de 2 GB menos la memoria virtual ya reservada por el proceso.".

De MDSN.

No estoy seguro acerca de LINUX/OSX/Whatever Else, pero probablemente también esté relacionado con el espacio de direcciones.

+1

solo para aclarar, ese es el tamaño de una vista de archivo, no el tamaño del archivo en sí. –

+5

"2 GB menos la memoria virtual ya reservada por el proceso" ¿está en la máquina de 32 bits? ¿Es diferente en una caja de 64 bits? – user88185

0

Con FUSE en linux, también puede crear un sistema de archivos en memoria que se extienda a disco bajo demanda. No estoy seguro de que califique como memoria mapeada, y la distinción se vuelve borrosa.

-3

entrada de Wikipedia sobre el tema: http://en.wikipedia.org/wiki/Memory-mapped_file

+0

No vi otros límites mencionados en este artículo de Wikipedia, ¿eso significa que ¿no hay ninguno? – user88185

+1

Si bien esto puede responder teóricamente a la pregunta, [sería preferible] (http: //meta.stackoverflow.com/q/8259) para incluir las partes esenciales de la respuesta aquí y proporcionar el enlace para referencia. –

9

Esta ha sido mi experiencia al usar archivos mapeados en memoria en Win32:

Si el mapa de todo el archivo en un segmento, que normalmente se nutre en 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 qué más se esté ejecutando.

Si usa /3g switch puede obtener más de 2GB hasta aproximadamente 2700MB pero el rendimiento del sistema operativo se penaliza.

No estoy seguro acerca de 64 bits, nunca lo he probado, pero supongo que el tamaño máximo de archivo está limitado solo por la cantidad de memoria física que tiene.

+0

En 64 bits, el límite es el espacio de direcciones disponible, el mismo que en 32 bits. Puede asignar una vista de 1 GB en una máquina de 32 bits que solo tiene 32 MB de memoria física. De la misma forma que puede asignar una vista de 10TB en una máquina de 32 bits que solo tiene 0.5GB de memoria. Solo las páginas de 4kb a las que realmente accede están mapeadas en la memoria real. – springy76

+1

@ springy76: no se puede asignar una vista de 10TB en una máquina de 32 bits. Solo en 64 bits. –

+4

@SergeyK. tienes toda la razón, eso también es lo que quería escribir, pero mis dedos escribieron algo más. Debería haber leído "De la misma forma en que puedes mapear una vista de 10TB en una máquina de 64 bits que solo tiene 0.5GB de memoria" – springy76

Cuestiones relacionadas