c# - ¿Cuándo usar archivos asignados en memoria?
memory-mapped-files (3)
Tengo una aplicación que recibe fragmentos de datos a través de la red y los escribe en el disco. Una vez que se han recibido todos los fragmentos, se pueden decodificar / recombinar en el único archivo que realmente representan.
Me pregunto si es útil usar archivos asignados en memoria o no, primero para escribir los fragmentos individuales en el disco, y luego para el archivo único en el que se decodifican todos.
Mi opinión es que podría ser útil solo para el segundo caso, ¿alguien tiene alguna idea sobre esto?
Edición: es una aplicación de C #, y solo estoy planeando una versión x64. (Por lo tanto, encontrarse con el problema del "mayor espacio libre contigioso" no debería ser relevante)
Los archivos asignados 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 lo obvio, pero Wikipedia ofrece un buen resumen de la situación ... http://en.wikipedia.org/wiki/Memory-mapped_file
Específicamente...
El enfoque de la memoria asignada tiene su costo en fallas de página menores: cuando un bloque de datos se carga en la memoria caché de la página, pero aún no se asigna al espacio de memoria virtual del proceso. Dependiendo de las circunstancias, la E / S de archivos asignados a la memoria puede ser mucho más lenta que la E / S de archivos estándar.
Parece que estás a punto de optimizar prematuramente la velocidad. ¿Por qué no un enfoque de archivo regular, y luego refactorizar para archivos MM más tarde si es necesario?
Los archivos asignados en memoria son beneficiosos para escenarios en los que se necesita acceder repetidamente a una parte relativamente pequeña (vista) de un archivo considerablemente más grande.
En este escenario, el sistema operativo puede ayudar a optimizar el uso general de la memoria y el comportamiento de paginación de la aplicación mediante la paginación dentro y fuera solo de las partes utilizadas más recientemente del archivo asignado.
Además, los archivos asignados en la memoria pueden exponer características interesantes como la copia en escritura o servir como la base de la memoria compartida.
Para su escenario, los archivos asignados en memoria pueden ayudarlo a armar el archivo si los fragmentos llegan a estar fuera de orden. Sin embargo, aún es necesario saber el tamaño del archivo final de antemano.
Además, debe acceder a los archivos solo una vez, para escribir un fragmento. Por lo tanto, una ventaja de rendimiento sobre la E / S asíncrona implementada explícitamente es poco probable, pero puede ser más fácil y rápido implementar correctamente el escritor de archivos.
En .NET 4, Microsoft agregó soporte para archivos mapeados en memoria y hay algunos artículos completos con código de ejemplo, por ejemplo, http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx .
Yo diría que ambos casos son relevantes. Simplemente escriba los fragmentos individuales en su lugar correspondiente en el archivo mapeado de memoria, fuera de orden, según vayan llegando. Esto, por supuesto, solo es útil si sabe dónde debe ir cada fragmento, como en un descargador de bittorrent. Si tiene que realizar un análisis adicional para saber dónde debe ir el trozo, el beneficio de un archivo mapeado en memoria podría no ser tan grande.