Tengo una matriz de objetos (por ejemplo, imágenes), que es demasiado grande para caber en la memoria (por ejemplo, 40 GB). Pero mi código necesita poder acceder aleatoriamente a estos objetos en tiempo de ejecución.¿Contenedor de acceso aleatorio que no cabe en la memoria?
¿Cuál es la mejor manera de hacerlo?
Desde el punto de vista de mi código, no debería importar, por supuesto, si algunos de los datos están en el disco o almacenados temporalmente en la memoria; debe tener acceso transparente:
container.getObject(1242)->process();
container.getObject(479431)->process();
Pero, ¿cómo debo implementar este contenedor? ¿Debería simplemente enviar las solicitudes a una base de datos? Si es así, ¿cuál sería la mejor opción? (Si es una base de datos, entonces debería ser gratuita y no demasiada complicación administrativa, ¿tal vez Berkeley DB o sqlite?)
¿Debo implementarlo yo mismo, memorizando objetos después del acceso y purgando la memoria cuando está llena? ¿O hay buenas bibliotecas (C++) para esto por ahí?
Los requisitos para el contenedor serían que minimiza el acceso al disco (algunos elementos pueden ser accedidos con más frecuencia por mi código, por lo que deben mantenerse en la memoria) y permite un acceso rápido.
ACTUALIZACIÓN: que resulta que STXXL no funciona para mi problema porque los objetos guardo en el contenedor tienen un tamaño dinámico, es decir, el código puede actualizarlos (aumentando o disminuyendo el tamaño de algunos objetos) en tiempo de ejecución. Pero STXXL no puede manejar eso:
contenedores STXXL asumen que los datos tipos que almacenan los datos son llanura de edad tipos (POD). http://algo2.iti.kit.edu/dementiev/stxxl/report/node8.html
¿Podría comentar sobre otras soluciones? ¿Qué tal usar una base de datos? ¿Y cuál?
Sin saber más acerca de su problema, yo diría que ambos (lectura de disco y almacenamiento en caché de algunos resultados, o utilizando una base de datos con el almacenamiento en caché) son buenas soluciones –
Si va a modificar el objeto, no está creando un nuevo objeto ? Luego, tiene el objeto antiguo y el nuevo o elimina el antiguo y lo reemplaza con el nuevo objeto. – codeDr