Pasé algún tiempo investigando IO asignada a la memoria para una aplicación en la que estoy trabajando. Tengo algunos archivos muy grandes (escala de TB), y quiero mapear segmentos de ellos en la memoria, tanto para leer como para escribir, aprovechando al máximo el almacenamiento en caché del nivel del sistema operativo. El software que estoy escribiendo necesita funcionar bajo Unix/Linux y Windows ... el rendimiento es crítico.Mapeo de la memoria independiente de la plataforma [archivo] IO
Descubrí boost::iostreams::mapped_file_source
y boost::iostreams::mapped_file_sink
, que proporcionan la mayoría de las instalaciones que estoy buscando. Las instalaciones de las que me gustaría, pero no he encontrado son:
- Forzar una sincronización de los datos escritos en el disco (
msync
(2) en Unix;FlushViewOfFile
en Windows) - de bloqueo de archivos para evitar que dos procesos intentar escribir el mismo archivo al mismo tiempo (o leer el archivo mientras todavía se está escribiendo ..)
- atributos de control del archivo en el momento de la creación (Unix)
¿Puedo hacer estas cosas usando "boost/iostreams/device/mapped_file.hpp"
? ¿Hay otras bibliotecas independientes de plataforma que se ajusten mejor a mis requisitos? ¿Debo desarrollar mi propia biblioteca multiplataforma para obtener esta flexibilidad?
BTW, "memoria mapeada I/O" generalmente se refiere a la lectura de los puertos de E/S utilizando direcciones (también conocido como memoria mapeada) (como el uso de un puntero) en lugar de utilizar el procesador de E/O instrucciones. –
Punto justo. Estoy hablando de la E/S de archivos mapeados en memoria [http://en.wikipedia.org/wiki/Memory- mapped_file] y he editado el título para reflejar esto. – aSteve