Pregunta

¿Cuál es la forma más eficiente de almacenar arrays grandes (10000x100) en una base de datos, por ejemplo, hsqldb? Necesito hacer esto para un determinado programa de matemáticas que estoy escribiendo en java. Por favor ayuda. La matriz completa se recuperará y almacenará a menudo (no tanto los elementos individuales). Además, algunos metadatos sobre la matriz deben almacenarse sobre la matriz.

¿Fue útil?

Solución

Gran pregunta.

A menos que desee traducir sus matrices a un conjunto de tablas normalizadas, lo que parece que no lo hace, es posible que desee contemplar la serialización.

Serialización es una palabra elegante para convertir objetos en algún formato que puede guardar en el disco o en una base de datos. Los dos formatos principales para la serialización son binarios y XML, y estoy apostando a que Java tiene algún soporte para ello.

Dependiendo de los tipos de datos que estés usando, deberías poder convertir tu matriz en XML o binario y luego guardarla en un solo campo en la base de datos. Puede comenzar con esta técnica en Java si consulta http: //java.sun. com / developer / technicalArticles / Programming / serialization / . Sé que está integrado en .NET.

Espero que esto ayude. Déjame saber si puedo orientarte más.

Otros consejos

¿Qué hay de almacenar los datos como un BLOB y usar Java para decodificar el BLOB en una matriz Java real? Sería mucho más eficiente almacenar y recuperar todo el conjunto de un solo trago, pero sería terrible para manipular elementos individuales.

Cree una representación interna, ya sea XML, JSON, algún archivo binario que se presente, o cualquier otra forma de serialización.

Guárdalo en una tabla usando el " blob " tipo de datos. Almacene todos los metadatos asociados con la matriz en columnas adicionales.

Estoy totalmente en desacuerdo con que la forma de hacerlo sea crear una tabla con el mismo número de filas y columnas que su matriz, que es un precio muy alto para pagar por la funcionalidad que no usa.

Prepare sus declaraciones de inserción / selección de antemano, y use las variables de enlace para cambiar la matriz con la que está trabajando, no haga que db repare cada solicitud.

Si es solo una matriz, ¿por qué no usar un archivo binario?

Como ya se ha sugerido: no utilice un RDBMS si no necesita las funciones. En lugar de Serialización, es posible que desee considerar una API de bajo nivel como JDBM que proporciona alguna base de datos como características como la gestión un índice en el disco.

Si sus datos están densamente empaquetados (el histograma de valores está cerca de una línea plana), su mejor opción es blob y serialización utilizando Objeto [Output / Input] Stream.

De lo contrario, podría resultarle más eficiente usar matrices dispersas y la variación del esquema Entidad-Atributo-Valor. Aquí hay un ejemplo:

 Name | IndexKey  | Value
------+-----------+-------
 foo  | 'default' | 39        
 foo  | 0:0:0     | 23
 foo  | 0:0:1     | 34
 foo  | 1:5:0     | 12
 ...
 bar  | 1:3:8     | 20
 bar  | 1:3:8     | 23
 bar  | 1:1:1     | 24
 bar  | 3:0:6     | 54
 ...

Esto también le permite actualizaciones rápidas a partes de la tabla y la selección de segmentos utilizando el operador "me gusta" de SQL.

Si el número de sus dimensiones se fija para desglosar la columna clave para separar las columnas int para cada dimensión a fin de mejorar la eficiencia del índice y tener criterios de selección más flexibles (puede usar el primer índice 'nulo' para metadatos como el valor por defecto).

En cualquier caso, es una buena idea crear un índice agrupado en las columnas Name, IndexKey.

Defina una tabla con los datos que contiene su matriz e inserte los valores de la matriz en una tabla.

Este es un acceso / almacenamiento de datos muy simple. ¿Las dimensiones de su matriz siempre serán las mismas?

  • Hazlo en una gran transacción explícita. No fuerce al sistema de base de datos a crear una nueva transacción implícita para cada inserción.
  • Use una declaración preparada.

PostgreSQL tiene soporte incorporado para arrays.

http://www.postgresql.org/docs/8.0/interactive /arrays.html

Seriaización de Java a una matriz de bytes almacenada como BLOB será su mejor apuesta. Java serializará una gran matriz de manera bastante eficiente. Utilice el resto de las columnas de las filas para cualquier cosa que le interese consultar o mostrar fácilmente. También puede ser una buena idea mantener los BLOB en su propia tabla y tener el " regular " las filas apuntan al " BLOB " filas, si consulta e informa mucho sobre los datos que no pertenecen a BLOB (aunque esto puede variar según la implementación de la base de datos).

HSQLDB 2.0 admite matrices unidimensionales almacenadas como una columna de la tabla. Por lo tanto, cada fila de la tabla se corresponderá con una fila de la matriz 2D.

Pero si desea recuperar una matriz 2D en su conjunto, BLOB es la mejor solución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top