Domanda

Qual è il modo più efficiente per archiviare array di grandi dimensioni (10000x100) in un database, ad esempio hsqldb? Devo farlo per un certo programma di matematica che sto scrivendo in Java. Per favore aiuto. L'intero array verrà recuperato e archiviato spesso (non così tanti singoli elementi). Inoltre, alcuni metadati sull'array devono essere memorizzati sull'array.

È stato utile?

Soluzione

Ottima domanda.

A meno che tu non voglia tradurre le tue matrici in un set di tabelle normalizzate, che sembra che tu non faccia, potresti voler considerare la serializzazione.

La serializzazione è una parola elaborata per trasformare gli oggetti in un formato che è possibile salvare su disco o su un database. I due principali formati per la serializzazione sono binari e XML, e sto scommettendo che Java ne abbia un supporto.

A seconda dei tipi di dati che stai utilizzando, dovresti essere in grado di trasformare l'array in XML o binario e quindi salvarlo in un singolo campo nel database. Puoi iniziare con questa tecnica in Java visitando http: //java.sun. com / developer / technicalArticles / Programmazione / serializzazione / . So che è integrato in .NET.

Spero che questo aiuti. Fammi sapere se posso darti ulteriori indicazioni.

Altri suggerimenti

Che ne dite di archiviare i dati come BLOB e usare Java per decodificare il BLOB in un vero array Java? Sarebbe molto più efficiente per archiviare e recuperare l'intero array in un solo sorso, ma sarebbe terribile per twiddling singoli elementi.

Trova una rappresentazione interna, che sia XML, JSON, qualche file binario che ti viene in mente o qualsiasi altra forma di serializzazione.

Memorizzalo in una tabella usando il " blob " tipo di dati. Archivia eventuali metadati associati alla matrice in colonne aggiuntive.

Non sono assolutamente d'accordo sul fatto che il modo per farlo sia quello di creare una tabella con lo stesso numero di righe e colonne della tua matrice - questo è un prezzo molto alto da pagare per funzionalità che non usi.

Prepara in anticipo le tue istruzioni insert / select e usa le variabili bind per cambiare la matrice con cui stai lavorando - non fare in modo che il db ricalchi ogni richiesta.

Se è solo 1 array, perché non utilizzare un file binario?

Come già suggerito: non utilizzare un RDBMS se non sono necessarie le funzionalità. Invece di serializzare, anche se potresti voler concedere un'API di basso livello come JDBM che fornisce alcune funzionalità di database come la gestione un indice su disco.

Se i dati sono densamente compressi (l'istogramma dei valori è vicino alla linea piatta), la scelta migliore è BLOB e serializzazione utilizzando il flusso Object [Output / Input].

Altrimenti, potresti trovare più efficiente l'uso di array sparsi e variazioni dello schema Entità-Attributo-Valore. Ecco un esempio:

 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
 ...

Ciò consente anche aggiornamenti rapidi a parti della tabella e la selezione di sezioni utilizzando l'operatore SQL "Mi piace".

Se il numero delle dimensioni è fisso per scomporre la colonna chiave per separare le colonne int per ciascuna dimensione al fine di migliorare l'efficienza dell'indice e disporre di criteri di selezione più flessibili (è possibile utilizzare il primo indice 'null' per metadati come il valore predefinito).

In ogni caso, è una buona idea creare un indice cluster sulle colonne Name, IndexKey.

Definisci una tabella con i dati contenuti nell'array e inserisci i valori dell'array in una tabella.

Questo è un accesso / archiviazione dei dati molto semplice. Le dimensioni dell'array saranno sempre le stesse?

  • Fallo in un'unica grande transazione esplicita. Non forzare il sistema di database a creare una nuova transazione implicita per ogni inserimento.
  • Utilizza un'istruzione preparata.

PostgreSQL ha il supporto integrato per gli array.

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

La serializzazione Java su un array di byte memorizzato come BLOB sarà la soluzione migliore. Java serializzerà un array di grandi dimensioni in modo abbastanza efficiente. Usa il resto delle colonne delle righe per tutto ciò che ti interessa interrogare o visualizzare prontamente. Può anche essere una buona idea tenere i BLOB nella propria tabella e avere il "normale" le righe puntano al " BLOB " righe, se esegui query e rapporti molto sui dati non BLOB (sebbene ciò possa variare in base all'implementazione del database).

HSQLDB 2.0 supporta matrici unidimensionali memorizzate come una colonna della tabella. Quindi ogni riga della tabella corrisponderà a una riga dell'array 2D.

Ma se vuoi recuperare un array 2D nel suo insieme, BLOB è la soluzione migliore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top