2009-12-07 18 views
40

que tienen una aplicación que recibe trozos de datos por la red, y escribe esto en el disco. Una vez que se hayan recibido todos los trozos, que se pueden decodificar/recombinado en el archivo único que realmente representan.Cuándo usar los archivos mapeados en memoria?

Me pregunto si es útil utilizar archivos mapeados en memoria o no: primero para escribir los fragmentos individuales en el disco, segundo para el único archivo en el que todos están decodificados.

Mi propia sensación es que podría ser útil solo para el segundo caso, ¿alguien tiene algunas ideas al respecto?

Edit: Es una aplicación C#, y solo estoy planeando una versión x64. (Por lo tanto, no es relevante encontrar el problema del 'espacio contigioso más grande')

+0

Buena llamada, he editado mi publicación para elaborar: será una aplicación solo para x64. – Pygmy

+1

¿Qué ventaja (s) crees que usar un archivo MM te dará? –

+0

¿No es la velocidad la principal ventaja de los archivos mmaped? –

Respuesta

25

Los archivos mapeados en memoria son útiles para escenarios en los que se debe acceder repetidamente a una porción relativamente pequeña (vista) de un archivo considerablemente más grande.

En este escenario, el sistema operativo puede ayudar a optimizar el uso de memoria en general y el comportamiento de búsqueda de la aplicación por parte de paginación dentro y fuera solamente las porciones utilizados más recientemente del archivo asignado.

Además, los archivos mapeados en memoria pueden exponer características interesantes tales como copiar sobre escritura o servir como base de la memoria compartida.

Para su escenario, los archivos mapeados en memoria pueden ayudarlo a armar el archivo si los fragmentos llegan fuera de servicio. Sin embargo, aún necesitaría saber el tamaño del archivo final por adelantado.

También, usted debe acceder a los archivos de una sola vez, para escribir un trozo. Por lo tanto, es poco probable obtener una ventaja de rendimiento sobre las E/S asíncronas explícitamente implementadas, pero puede ser más fácil y más rápido implementar su grabadora de archivos correctamente.

En.NET 4, Microsoft agregó soporte para archivos mapeados en memoria y hay algunos artículos completos con código de ejemplo, p. http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx.

+4

No estoy de acuerdo con que los mmf sean solo para vistas pequeñas. En los sistemas de 64 bits, puede visualizar fácilmente todo el archivo. Reubicar una vista es una costosa operación IO. –

+2

Tienes razón. Se pueden usar para vistas arbitrariamente grandes o de archivos completos, en particular en el espacio de direcciones de 64 bits. Pero no es allí donde brillan, en particular, cuando el archivo se lee o escribe solo una vez. Mi punto es que, en tales casos, la sincronización de E/S será igual de eficiente, pero es más difícil de implementar correctamente. – user33675

3

Diría que ambos casos son relevantes. Basta con escribir los trozos individuales a su lugar adecuado en el archivo de memoria asignada, fuera de servicio, ya que vienen en. Por supuesto, esto sólo es útil si se sabe dónde debe ir cada trozo, como en un programa de descarga BitTorrent. Si tiene que realizar un análisis adicional para saber a dónde debe ir el fragmento, el beneficio de un archivo mapeado en memoria podría no ser tan grande.

12

Los archivos mapeados en memoria se utilizan principalmente para la comunicación entre procesos o la mejora del rendimiento de E/S.

En su caso, está tratando de obtener un mejor rendimiento de E/S?

odio señalar la obivious, pero Wikipedia da un buen resumen de la situación ... http://en.wikipedia.org/wiki/Memory-mapped_file

Específicamente ...

El enfoque mapeado de memoria tiene su costo en los fallos de página menores - cuando se carga un bloque de datos en la memoria caché de página, pero aún no se ha asignado al espacio de la memoria virtual del proceso. Dependiendo de las circunstancias, la E/S de archivo mapeada en memoria puede ser sustancialmente más lenta que la E/S de archivo estándar.

Parece que está a punto de optimizar prematuramente la velocidad. ¿Por qué no un enfoque de archivo regular y luego refactorizar los archivos MM más adelante si es necesario?

+2

Estoy buscando un mejor rendimiento de IO. Ahora obtengo unos 12MB/seg. De datos (pero en el futuro esto será mucho más) y necesito poder procesarlos/escribirlos en el disco lo más rápido posible. He leído el artículo de wikipedia, y entiendo los beneficios cuando leo, pero el mejor uso y los mejores beneficios cuando * escribir * en archivos no es exactamente claro para mí, por lo que estoy pidiendo ayuda para entenderlo:) – Pygmy

Cuestiones relacionadas