Come efficiente sarà quello di utilizzare una banca dati in memoria per memorizzare milioni di valori temporanei?

StackOverflow https://stackoverflow.com/questions/3936044

Domanda

La mia applicazione attualmente memorizza milioni di elementi Double per un calcolo. Questi valori sono solo valori temporanei prima di essere utilizzate per un algoritmo specifico che viene eseguito alla fine del calcolo. Una volta che questo calcolo è fatto, i milioni di valori possono essere scartati.

La storia completa è qui , se avete bisogno di ulteriori dettagli.

Una delle soluzioni che è stato proposto è quello di utilizzare un database in-memory.

Quindi, se io vado con questa soluzione, userò questo database per memorizzare i miei valori in una tabella per sostituire il mio Map<String, List<Double>> corrente, come:

create table CALCULATION_RESULTS_XXX (
  deal_id varchar2,
  values number
);

(una tabella per il calcolo, XXX è l'ID di calcolo)

Quindi, durante il calcolo, farò quanto segue:

  1. Una volta avviato il calcolo, creo la tabella CALCULATION_RESULTS_XXX.
  2. Ogni volta che ho bisogno di aggiungere un valore, ho inserire un record in questa tabella.
  3. Al termine del calcolo, io uso il contenuto della tabella per il mio algoritmo.
  4. Infine, mi calo questa tabella.

Come spiegato in un altro soggetto , al momento, il mio calcolo può memorizzare diverse centinaia di MB di dati nella memoria, come un elenco di 30 * 1.000.000 di Double avrà bisogno di circa 240MB.

Le domande ora:

  1. Se vado con un database in-memory, fa la mia consomption memoria sarà diminuita?
  2. Quali sono i punti specifici che dovrò fare attenzione per quanto riguarda l'utilizzo di database (o creazione della tabella), l'inserimento di dati, ecc?
  3. penso che sceglierò H2 Database . Pensi che sia la scelta migliore per le mie esigenze?
È stato utile?

Soluzione

Il problema è sufficientemente semplice che si ha realmente bisogno di solo dare un andare e vedere come le (performance) risultati funzionano.

È già un'implementazione che utilizza solo semplici strutture in memoria. Personalmente, dato che anche il computer più economico da Dell viene fornito con 1 GB di RAM +, si potrebbe anche attaccare con quello. A parte questo, dovrebbe essere abbastanza semplice per wack in un database o due. Mi piacerebbe prendere in considerazione Sleepycat Berkerly DB (che ora è di proprietà di Oracle ...), perché non è necessario utilizzare SQL e dovrebbero essere abbastanza efficiente. (Fanno supporto Java).

Se i risultati sono promettenti, mi piacerebbe quindi prendere in considerazione ulteriori indagini, ma questo in realtà dovrebbe richiedere solo pochi giorni di lavoro, al massimo, compreso il benchmarking.

Altri suggerimenti

Un semplice HashMap sostenuta da Terracotta farebbe meglio e permetterà di memorizzare la raccolta più grande poi JVM memoria virtuale.

database embedded, in particolare, quelli basati su SQL, aggiungerà la complessità e l'overhead al codice, in modo che non vale la pena. Se davvero bisogno di una memoria persistente con accesso casuale, provare uno dei DB NoSQL, come CouchDB , Cassandra , Neo4j

Non so se sarà più veloce, in modo che avrebbe dovuto provare. Quello che voglio raccomandare è quello di fare gli inserti in batch di un intero elenco quando non immediatamente bisogno più quella lista. Non salvare il valore per valore:)

Se stai algoritmo fine può essere espressa in SQL potrebbe anche valere la pena di farlo, e non caricare tutte le liste di nuovo in. In ogni caso, non mettere nulla come un indice o un vincolo sui valori , e preferibilmente anche non permettere NULL (se possibile). Mantenendo indici e vincoli costano tempo, e permettendo NULL può anche costare tempo, oppure creare sovraccarico. deal_ids può (e sono), naturalmente indicizzato come sono le chiavi primarie.

Non è molto, ma almeno meglio di una sola risposta down-votato:)

Non c'è davvero nessuna ragione al mondo per aggiungere un componente esterno per rendere la vostra esecuzione del programma più lento. Comprimere il blocco di dati e scrivere in file se è necessario gestire più di memoria interna a disposizione. Una stazione di lavoro ora prende 192 GB di RAM, quindi non può permettersi di perdere molto tempo su di esso.

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