2010-08-06 17 views
5

Me gustaría diseñar una estructura de datos JVM (Java/Scala) que pueda usarse para representar y almacenar los contenidos de tablas de bases de datos relacionales arbitrarias. La estructura de datos debe ser rápida (no demasiado intensiva en gc, compatible con caché) y eficiente desde el punto de vista de la memoria, por lo que las tablas más grandes pueden caber en la memoria RAM.Estructura de datos para almacenar tablas de bases de datos arbitrarias

Una solución que ahorra memoria es almacenar cada columna por separado en una matriz primitiva, pero me preocupa la compatibilidad con la memoria caché porque los elementos en la misma fila no se almacenan juntos. Una fila con N columnas incurrirá en N fallas de caché, sin importar cuán estrechas sean las columnas.

Otra solución es almacenar cada fila en una matriz de objetos donde cada elemento representa un campo y se convierte al tipo correcto en la recuperación, pero esto requiere almacenar tipos numéricos en su forma encuadrada, por lo que no es muy eficiente en la memoria. Y probablemente tampoco sea ese caché eficiente.

Otra solución es diseñar los datos de cada fila en una matriz de bytes de la misma forma que las bases de datos reales serializan sus filas, usando solo tantos bytes como sea necesario. Es amigable con la memoria caché y eficiente en la memoria, pero me preocupa el costo de la serialización/deserialización en cada acceso.

¿Cuál es la mejor manera?

Respuesta

1

¿Cuál es el propósito de hacer esto? Probablemente sea mejor simplemente almacenar los datos que recupera de su base de datos (como los objetos a los que los asigna) en algún tipo de capa de almacenamiento en caché como EhCache, OSCache, Memcache, etc., en lugar de reinventar la rueda.

+0

Es para un proyecto lateral de la base de datos de memoria principal. –

1

¿Por qué no utilizar hsqldb o h2?

Ambos admiten el modo en memoria y son puros de Java. Te obligan a usar SQL para acceder, pero en el otro extremo, no tienes que implementar tu propia unión.

Ambos son de código abierto, por lo que también puede usar esto como una línea base para el rendimiento y ver si hacer su propia estructura de datos columna por fila sería más rápido y valdría la pena el esfuerzo.

+0

HSQLdb asigna aproximadamente 80 bytes por fila para una tabla con solo una columna entera (es decir, 4 bytes de datos reales). De acuerdo con: http://hsqldb.org/doc/2.0/guide/deployment-chapt.html#deployment_mem_disk-sect –

1

Una cuarta solución sería almacenar los datos de cada fila como cadenas en lugar de matrices de bytes. Esto puede evitar costos de serialización en casos más, siempre que la mayoría de los datos sean cadenas.

Esto también será más fácil de depurar y será independiente de la plataforma. Por supuesto, tiene algunas limitaciones: p. un flotante no se puede representar tal como está, sino que se puede almacenar en algo similar a un formato SQL DECIMAL.

Cualquier solución será una solución de compromiso.

EDIT Sin embargo, preferiría la solución de matriz de bytes para su caso: una matriz de bytes por fila. Esto debería ser más fácil de guardar en caché para filas de tamaño fijo. Pero también debe proporcionar una solución para filas de tamaño variable. Un lenguaje de bajo nivel parece encajar mejor con esa tarea, en C se podrían definir dos formatos: filas de tamaño fijo donde los metadatos de la tabla contienen desviaciones de columna (por ejemplo, columna 1: bytes 0..31, columna 2: bytes 32..127 etc.) y un segundo formato de fila de tamaño variable, donde las filas contienen los tamaños de columnas (por ejemplo, los bytes 1..3 contienen el tamaño, el siguiente número de bytes contiene los datos, luego otros 4 bytes contienen el tamaño, los datos siguientes y así).

Cuestiones relacionadas