Tengo un programa en el que deseo poder almacenar ciertos datos (bloques asignados dinámicamente) en el disco para reducir el uso de memoria y la persistencia.Asignación de memoria dinámica basada en disco
Mi primer pensamiento fue escribir mi propio asignador personalizado que administraba el contenido de los archivos en el disco, pero quiero ver qué alternativas hay también.
He examinado asignadores de memoria personalizados y temas sobre la serialización de objetos, pero existen diferencias sutiles, buenas y malas, al adaptar esos principios a la gestión del espacio de direcciones de un archivo.
En esta situación: se accede
memoria sólo a través de IO (lectura/escritura) funciones en lugar de directamente
se almacenan No hay objetos (métodos/punteros), sólo los datos.
El tamaño de un archivo no es estático, por lo que debe crecer cuando sea necesario en lugar de ser grande y estática
Para mis usos, es aceptable para volver a punteros existentes después de la desfragmentación
Debido a que los datos no son de un tamaño fijo, la mayoría de las implementaciones de bases de datos parecen no ser adecuadas.
Pregunto, ¿cuál es el mejor enfoque para este problema? ¿Debería implementar un simple asignador de memoria que trate un archivo como el montón?
Como referencia, estoy usando C++ en dispositivos integrados.
Editar: Implementé mi propio administrador de memoria que usa asignación de memoria de amigos y tamaños de bloque de potencias de dos. Estoy convencido de que es correcto y no se filtra, combina bloques libres y puede hacer una desfragmentación 'detener el mundo'.
El problema es que, como era de esperar, existe una gran fragmentación interna y externa. No soy un experto en este campo y aunque me parece fascinante (todavía soy un estudiante), me pregunto si hay otras implementaciones que hayan hecho lo mismo o algo similar. Seguramente no puedo ser el único?
Algunos temas útiles, pero hasta ahora incompatibles son:
mmap TBH que no he utilizado pero mmap lo que aborda el archivo IO, pero no la gestión del espacio de direcciones de archivos.
BOOST:serialization Tengo una (probablemente injustificada) renuencia a usar las bibliotecas de impulso en este momento.
STXXL dirección de memoria de tamaño variable de asignación interesante pero tampoco
Doug Lea Memory Allocator tiene muy buenas ideas sobre los problemas con los asignadores de memoria, pero no estoy en condiciones de tratar de hacer mi propia aplicación
+1, por mencionar SQLite, es una gran biblioteca y la uso mucho. Pero SQLite no maneja bien el patrón de uso que busco. Que se trata de grandes cantidades de datos de tamaño completamente arbitrario (no registros fijos). Cuando los tamaños de los archivos crecen (GB +), la implementación de SQLite se detiene prácticamente. – Akusete
@Akusete lo hace? Recuerdo haber importado un volcado en.wikipedia en una base de datos sqlite y todavía funcionaba bastante bien ... – CAFxX
@CAFxX: Buena pregunta. Esta fue una declaración anecdótica basada en el uso de SQLite con esquemas muy grandes (100 GB +) y complejos. Supuse que como solo tenía que almacenar blobs, tener una base de datos sql (incluso sqlite) incurriría en una carga innecesaria y sería subóptimo, pero supongo que en retrospectiva era una suposición débil. Además, yo era un estudiante que intentaba implementar un motor de base de datos, por lo que respaldar su almacenamiento de blob con SQLite parecía una salida de emergencia. :) – Akusete