2010-03-28 17 views
12

Quiero crear un archivo binario mapeado en la memoria; sin embargo, no estoy seguro de cómo crear el archivo para mapearlo en el sistema. Leí la documentación varias veces y me doy cuenta de que hay 2 implementaciones de archivos mapeados, una en iostream y la otra en interproceso.¿Hay alguna diferencia entre el archivo mapeado iostream de boost y el archivo mapeado entre procesos de impulso?

¿Tienen alguna idea sobre cómo crear un archivo mapeado en la memoria compartida? Estoy tratando de permitir que un programa de subprocesos múltiples lea una matriz de doble grande escrito en un formato de archivo binario. ¿Cuál es la diferencia entre el archivo mapeado en iostream e interproceso?

Respuesta

2

Por lo que puedo decir, iostreams colocará el archivo asignado en la memoria compartida (esto es lo que quiere); sin embargo, el interproceso coloca el archivo en el espacio de direcciones de otro proceso.

Probablemente debería utilizar iostreams a menos que tenga múltiples procesos (no hilos) que se comunicarán entre sí de alguna manera.

+0

Gracias por la aclaración Joe, voy a probar iostream. – Yijinsei

+2

@Joe D: esa no es la impresión que obtengo de la biblioteca entre procesos, en absoluto. Específicamente, de la documentación: "el sistema crea una asignación de archivos para asociar el archivo y el espacio de direcciones del proceso". Para procesos múltiples, esencialmente compartió memoria con una copia de seguridad del sistema de archivos. – rcollyer

+0

Sí, pero la biblioteca entre procesos no crea una copia de seguridad del sistema de archivos, simplemente asigna el archivo en la memoria compartida entre procesos. Sin embargo, iostreams, lo mapeará en la memoria para un solo proceso. Que es probablemente (no he comprobado la implementación) más eficiente. –

0

La principal diferencia que veo entre los dos es cómo se usan. En boost-interprocess, para usar un archivo mapeado en memoria, cree objetos en ese espacio de memoria usando la ubicación new, y esos objetos son automáticamente persistentes en forma binaria en su archivo. Otros procesos pueden asignar el mismo archivo y usar esos objetos, o el programa puede usarlo como un caché persistente y volver a cargarlos más tarde. Los archivos mapeados en memoria en boost-iostreams actúan como secuencias de archivos, con los beneficios adicionales de ser un boost::iostream, y proporcionarían semántica de flujo para la comunicación entre procesos.

Para un solo proceso, no hay mucho beneficio al usar archivos mapeados de memoria boost::iostream. Sin embargo, puede reducir la latencia al trabajar con el archivo, ya que ya se habrá cargado en la memoria. Pero solo obtendrá este beneficio si está constantemente reescribiendo partes del archivo. Para una sola pasada de lectura/escritura del archivo, es posible que no haya ninguna aceleración.

Cuestiones relacionadas