¿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
Respuesta
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.
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?
No, las dimensiones no serán las mismas. –
Si las dimensiones no son las mismas, tendrá que usar algo así como la serialización como se indica a continuación. – Nick
Haría eso también si las dimensiones no son las mismas. No tiene sentido crear y borrar tablas todo el tiempo. –
- 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.
¿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.
BLOB es el camino a seguir – MarlonRibunal
PostgreSQL tiene soporte integrado para matrices.
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
¿Hay un equivalente del tipo ARRAY de PSQ en MySQL y MicrosoftSQL? – luksmir
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.
Si es solo 1 matriz, ¿por qué no utilizar 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 concider una API de bajo nivel como JDBM que proporciona algunas funciones similares a la base de datos, como administrar un índice en disco.
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.
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).)
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.
- 1. Matrices y bases de datos
- 2. Almacenamiento de matrices en la base de datos utilizando ActiveRecord
- 3. Almacenamiento de matrices en Solr
- 4. Objeto vs Almacenamiento de documentos (Bases de datos) = Diferencia (nosql)?
- 5. Bases de datos usando JSON como formato de almacenamiento/transporte
- 6. Almacenamiento de matrices anidadas en una cookie
- 7. Bases de datos translúcidas
- 8. ¿Qué métodos de almacenamiento en caché, que no sean archivos o bases de datos, están disponibles?
- 9. Almacenamiento de matrices PHP en Wordpress Base de datos de usuarios Meta
- 10. ¿Está el almacenamiento de recuentos de registros de bases de datos redundantes?
- 11. Disparadores de bases de datos
- 12. Clojure y bases de datos NoSQL
- 13. Definición de función Haskell y matrices de almacenamiento en caché
- 14. Patrones de diseño de datos/bases de datos?
- 15. Cómo crear varias conexiones de bases de datos para diferentes bases de datos en java
- 16. Pros/contras de bases de datos basadas en documentos vs. bases de datos relacionales
- 17. ¿Alguien que usa bases de datos NoSQL para el almacenamiento de registros médicos?
- 18. JDBC - Conectar varias bases de datos
- 19. MagicalRecord: bases de datos múltiples
- 20. En mysql, las bases de datos show; el comando no enumera todas mis bases de datos
- 21. EXPLAIN SELECT en otras bases de datos
- 22. Guardar ArrayLists en bases de datos SQLite
- 23. Utilizando bases de datos MySQL en Mathematica
- 24. atributos multivalor en las bases de datos
- 25. Seleccionar columnas en diferentes bases de datos
- 26. ¿Qué bases de datos tengo permisos en
- 27. Bases de datos RDF en Android
- 28. Referencia cruzada en varias bases de datos
- 29. Múltiples bases de datos en Rails
- 30. LINQ en varias bases de datos
¿Necesita acceso aleatorio a los elementos de la matriz, o solo a las matrices? – gnud
¿Conoces la solución para PostgreSQL? – luksmir