2011-11-21 13 views
15

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?

+0

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. –

+0

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

Respuesta

3

Mira boost :: interprocess y boost :: interprocess :: file_mapping. Ellos tienen todo lo que necesitas.

boost::interprocess

boost::interprocess::file_mapping

+0

Puede que tenga razón ... pero, con boost :: interprocess, no veo cómo puedo (directamente) establecer el acceso a los datos en fragmentos del tamaño de la página OS ... – aSteve

+0

@aSteve, esta biblioteca admite la memoria mapeada archivos, consulte: http://www.boost.org/doc/libs/1_48_0/doc/html/interprocess/managed_memory_segments.html#interprocess.managed_memory_segments.managed_mapped_files – Nim

+0

Sí, boost :: interprocess admite archivos mapeados de memoria (administrados). .. "administrado" en este contexto implica que el espacio en el archivo se accede "como si" por malloc(). Obviamente valioso para la comunicación entre procesos, pero necesito un "no gestionado" más básico. enfoque para IO "en bruto". Necesito una función que devuelva un puntero a un bloque mapeado que contenga un desplazamiento de archivo arbitrario. Las interfaces boost :: iostreams :: mapped_file_ * son ideales aquí ... aunque no ofrecen la misma flexibilidad para la sincronización/bloqueo. He leído los documentos interprocesos: no puedo ver cómo usar el interproceso para IO mapeado "en bruto". – aSteve

Cuestiones relacionadas