2012-06-18 18 views
6

Estoy trabajando con un conjunto de datos de Jena simple, que solo tiene un archivo RDF de ~ 30 MB importado. Como parte de la aplicación, intento que los usuarios consulten el gráfico predeterminado (o un gráfico con nombre) e inserte los triples resultantes de la consulta en un nuevo gráfico con nombre. Para esto, estoy usando una sentencia CONSTRUCT para formar el conjunto de resultados de tripletas en formato RDF, luego pongo estas tripletas en un nuevo modelo (utilizando QueryExecution.execConstruct()) y agrego este modelo al conjunto de datos. Esto parece funcionar de nuevo, ya que el conjunto de datos obtiene un nuevo nodo de gráfico, y el tamaño del disco de la carpeta de la base de datos de TDB aumenta de tamaño.Cómo reducir el tamaño del Dataset de Jena respaldado por TDB?

El problema aquí aparece cuando intento eliminar un gráfico con nombre del conjunto de datos. Al utilizar el método removeNamedName ("graphName") de Dataset, elimino el modelo del conjunto de datos. Las consultas futuras sobre ese nombre de modelo revelan que se ha eliminado correctamente. Sin embargo, el tamaño del disco de la carpeta de la base de datos de TDB sigue siendo del mismo tamaño, incluso después de la sincronización y el cierre.

Al principio pensé que tal vez la base de datos solo estaba marcando el espacio de los archivos eliminados como libre para que se sobrescribiera a medida que aparecían nuevos datos, pero este no parece ser el caso. Si elimino un gráfico con nombre y lo reemplazo inmediatamente después de ejecutar el mismo programa, la carpeta no parece crecer, pero si agrego un nuevo gráfico con nombre y lo elimino en la misma ejecución, el tamaño de la carpeta aumenta y el modelo la eliminación no libera la memoria, lo que significa que después de algunas ejecuciones la carpeta de la base de datos es cinco o diez veces su tamaño original sin almacenar más datos.

Cualquier idea o ayuda sería genial, gracias de nuevo.

Respuesta

6

Puede obtener más información al preguntar en la lista de correo de Jena ([email protected]) pero intentaré responder. También es posible que desee echar un vistazo a la página TDB Architecture en el sitio web.

TDB almacena datos creando lo que llama una tabla de nodos que mapea los nodos RDF en identificadores enteros de 64 bits y viceversa. Luego construye índices separados usando estos ID enteros que le permiten realizar los diversos escaneos de base de datos necesarios para responder consultas SPARQL.

Al agregar datos, se pueden agregar entradas a estas dos estructuras (tabla de nodos e índices) pero al eliminar datos solo se eliminan los datos de los índices. Por lo tanto, con el tiempo, la tabla de nodos continuará creciendo incluso si elimina los datos antiguos porque no se eliminan de la tabla de nodos.

Las razones prácticas detrás de esto son dos:

  1. Los identificadores enteros codifican parte desplazamientos de archivo por lo que la identificación de las operaciones de búsqueda de nodo es un archivo de exploración rápida por lo tanto, a medida que se eliminan los datos que no se puede eliminar partes del Nodo tabla sin tener que reescribir todas las ID de nodo, es decir, la tabla de Nodo en la ID -> Dirección de nodo es un archivo secuencial (ayuda a hacer las inserciones muy rápido)
  2. Cuando se borran datos, no se sabe si se usa un Nodo varias veces sin hacer un escaneo completo de la base de datos. Por lo tanto, no se puede decir si una entrada de tabla de nodos debería eliminarse en primer lugar. La única forma viable de hacerlo sería implementar un esquema de conteo de referencia completo que, de por sí, agregue complejidad al sistema y ralentice las adiciones y eliminaciones.

Negación - Soy un confirmador en el proyecto Jena pero nunca han hecho ningún trabajo personalmente en el componente TDB por lo que este refleja mi mejor entendimiento y puede que no sea completamente exacta.

+0

¡Muchas gracias!Definitivamente revisaré la lista de correo, es una pena que la eliminación no reduzca necesariamente el tamaño de la mesa, pero es comprensible. Gracias de nuevo. – paul

Cuestiones relacionadas