Pregunta

Tengo 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 pueden ser decodificados / recombinado en el archivo único que realmente representan.

Me pregunto si es útil el uso de archivos mapeados en memoria o no -. Primero para escribir los trozos individuales en el disco, el segundo para ese fichero en el que se decodifican todos ellos

Mi sensación es que podría ser útil para el segundo caso, alguien tiene algunas ideas sobre esto?

Editar: Es una aplicación de C #, y yo sólo estoy planeando una versión de 64 bits. (Entonces, ejecutar en el problema más grande de espacio libre contigious 'no debe ser relevante)

¿Fue útil?

Solución

Los archivos asignados en memoria son beneficiosos para los escenarios en los que una porción relativamente pequeña (ver) de un archivo considerablemente más grande necesita ser visitada en varias ocasiones.

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 sólo las partes usadas más recientemente del archivo asignado.

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

Por su escenario, los archivos mapeados en memoria puede ayudar a montar el archivo si los trozos llegan fuera de orden. Sin embargo, todavía se necesita saber el tamaño final del archivo de antemano.

Además, debe ser acceder a los archivos de una sola vez, para escribir un trozo. Por lo tanto, una ventaja de rendimiento sobre asíncrona implementado de manera explícita / S es poco probable, pero puede ser más fácil y más rápido de implementar su escritor archivo correctamente.

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

Otros consejos

Los archivos asignados en memoria se utilizan principalmente para la comunicación entre procesos o mejora que O / rendimiento.

En su caso, ¿Estás tratando de obtener un mejor rendimiento de E / S?

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

En concreto ...

  

El enfoque de memoria mapeada tiene su costo en los fallos de página menores - cuando un bloque de datos se cargan en la memoria caché de la página, pero aún no asignada en el espacio de memoria virtual del proceso. Dependiendo de las circunstancias, la memoria de archivos E / S mapeada en realidad puede ser considerablemente más lento que el archivo de E / S estándar.

Parece que está a punto de optimizar prematuramente para la velocidad. ¿Por qué no un enfoque archivo normal y, a continuación, refactorizar para archivos MM tarde si es necesario?

Yo 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 usted tiene que realizar algún análisis adicional para saber dónde está el trozo debe ir, el beneficio de un archivo de memoria asignada no puede ser tan grande.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top