tipos terrestres pies metros medidas maritimos internacional contenedores contenedor comercio caracteristicas c++ algorithm data-structures stl on-disk

c++ - pies - tipos de contenedores terrestres



¿Clases de contenedor STL con respaldo de disco? (4)

Me gusta desarrollar algoritmos usando STL, sin embargo, tengo este problema recurrente en el que mis conjuntos de datos son demasiado grandes para el montón.

He estado buscando reemplazos para contenedores STL y algoritmos que están respaldados por discos, es decir, las estructuras de datos están almacenadas en el disco en lugar de en el montón.

Un amigo me señaló recientemente hacia stxxl . Antes de involucrarme demasiado ... ¿Hay otros reemplazos de STL respaldados por disco disponibles que debería considerar?

NOTA: No estoy interesado en la persistencia o las bases de datos integradas. Por favor, no mencione boost :: serialization, POST ++, Relational Template Library, Berkeley DB, sqlite, etc. Conozco estos proyectos y los uso cuando son apropiados para mis propósitos.

ACTUALIZACIÓN: Varias personas han mencionado los archivos de mapeo de memoria y el uso de un asignador personalizado, buenas sugerencias por cierto, pero les indicaría la discusión here donde David Abraham sugiere que los iteradores personalizados serían necesarios para los contenedores respaldados por disco. Lo que significa que no es probable que el enfoque del asignador personalizado funcione.


No sé mucho sobre el tema, pero podría ser posible escribir una interfaz similar a STL en un archivo mapeado en memoria.

editar: este enfoque puede ser adecuado si intenta acceder a una parte específica de un archivo enorme. Si intenta hacer algo con todo el archivo, es probable que genere una gran cantidad de fallas de página al leer en partes no guardadas en caché del archivo.


Nunca tuve que hacer algo como esto, pero podría ser posible hacer lo que desea haciendo escribiendo un asignador personalizado que haga uso de una memoria de archivos asignados para respaldar sus datos.

Ver boost::interprocesses for docs en su fácil implementación de archivos mapeados en memoria, este artículo del Dr. Dobbs para una discusión detallada sobre asignadores de escritura, y esta columna IEEE Software para una descripción del problema y el código de ejemplo .


Si (mientras escribe) no está interesado en la persistencia, la solución más simple sería aumentar el tamaño de su almacenamiento dinámico y utilizar las instalaciones de memoria virtual de su sistema operativo. La parte del montón que no cabe en la memoria física de su computadora terminará siendo paginada en el disco, proporcionándole exactamente lo que desea: acceso STL normal a los datos almacenados a menudo en el disco. El sistema operativo se encargará de almacenar en caché las páginas más usadas en la memoria física y desalojar en disco las que no usa mucho. Su código seguirá siendo el mismo, y puede aumentar su rendimiento simplemente agregando más memoria física.

Para aumentar el tamaño de su pila, verifique los parámetros de su sistema operativo, como ulimit (1) en los sistemas Unix y las propiedades del sistema - Avanzado - Rendimiento - Avanzado - Memoria virtual en Windows XP. Si alcanzas el límite de 4 GB de 32 bits, considera moverte a una arquitectura de 64 bits o compila tu programa para 64 bits.


He implementado algo muy similar. Implementar los iteradores es el más desafiante. boost::iterator_facade para implementar los iteradores. Usando boost::iterator_facade puede adaptar fácilmente cualquier estructura de datos en caché en disco para tener una interfaz de contenedor STL.