2008-10-17 20 views
11

¿Cuál es la forma más eficiente de almacenar matrices 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. Toda la matriz se recuperará y almacenará con frecuencia (no tanto elementos individuales). Además, algunos metadatos sobre la matriz deben almacenarse sobre la matriz.Almacenamiento de matrices en bases de datos

+0

¿Necesita acceso aleatorio a los elementos de la matriz, o solo a las matrices? – gnud

+0

¿Conoces la solución para PostgreSQL? – luksmir

Respuesta

15

Gran pregunta.

A menos que desee traducir sus matrices en un conjunto de tablas normalizadas, lo que parece que no es así, puede considerar la serialización.

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

Dependiendo de los tipos de datos que esté utilizando, debería poder convertir su 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 visitando http://java.sun.com/developer/technicalArticles/Programming/serialization/. Sé que está integrado en .NET.

Espero que esto ayude. Avíseme si puedo darle más instrucciones.

0

Define una tabla con los datos que contiene tu matriz e inserta los valores de la matriz en una tabla.

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

+0

No, las dimensiones no serán las mismas. –

+0

Si las dimensiones no son las mismas, tendrá que usar algo así como la serialización como se indica a continuación. – Nick

+0

Haría eso también si las dimensiones no son las mismas. No tiene sentido crear y borrar tablas todo el tiempo. –

0
  • Hágalo en una gran transacción explícita. No fuerce el sistema de base de datos para crear una nueva transacción implícita para cada inserción.
  • Usa una declaración preparada.
8

¿Qué le parece guardar los datos como un BLOB y usar Java para decodificar el BLOB en una matriz real de Java? Sería mucho más eficiente almacenar y recuperar toda la matriz de un solo trago, pero sería terrible para mezclar elementos individuales.

+0

BLOB es el camino a seguir – MarlonRibunal

0

PostgreSQL tiene soporte integrado para matrices.

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

+1

Ese es un punto muy bueno (aunque el OP especificó algún otro db, que podría no tener la asombrosa flexibilidad de PostgreSQL en ese sentido). ¿Sabes qué tan eficientemente esto se implementa? Tengo la impresión de que no está diseñado para arreglos grandes, pero puedo estar equivocado. – SquareCog

+0

¿Hay un equivalente del tipo ARRAY de PSQ en MySQL y MicrosoftSQL? – luksmir

2

llegar a una representación interna - ya sea XML, JSON, algunos archivos binarios a llegar a usted mismo, o cualquier otra forma de serialización.

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

Estoy totalmente en desacuerdo con que la manera de hacerlo es crear una tabla con el mismo número de filas y columnas que tu matriz; ese es un precio muy alto para pagar por la funcionalidad que no utilizas.

Prepare sus instrucciones de inserción/selección de antemano, y utilice las variables de vinculación para cambiar la matriz con la que está trabajando - no haga que la base de datos vuelva a analizar cada solicitud.

1

Si es solo 1 matriz, ¿por qué no utilizar un archivo binario?

1

Como ya se ha sugerido: No utilice un RDBMS si no necesita las funciones.En lugar de Serialización, es posible que desee concider una API de bajo nivel como JDBM que proporciona algunas funciones similares a la base de datos, como administrar un índice en disco.

1

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

De lo contrario, puede que le resulte más eficiente usar matrices dispersas y variaciones del esquema Entidad-Atributo-Valor. Aquí está 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 las partes de la mesa y la selección de segmentos utilizando SQL 'como' operador.

Si se fija el número de sus dimensiones para desglosar la columna clave para separar las columnas int para cada dimensión para 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 predeterminado).

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

0

Serialización Java a una matriz de bytes almacenada como BLOB será su mejor opción. Java serializará una gran matriz de manera bastante eficiente. Use el resto de las columnas de las filas para todo lo que le interese consultar o mostrar fácilmente. También puede ser una buena idea mantener los BLOB en su propia tabla y hacer que las filas "regulares" apunten a las filas "BLOB", si consulta e informa mucho sobre los datos que no son BLOB (aunque esto puede variar según la implementación de la base de datos).)

0

HSQLDB 2.0 admite matrices unidimensionales almacenadas como una columna de la tabla. Entonces cada fila de la tabla corresponderá a una fila de la matriz 2D.

Pero si quiere recuperar una matriz 2D como un todo, BLOB es la mejor solución.

Cuestiones relacionadas