2012-10-03 19 views
6

Attualmente sto lavorando su un progetto in Java in cui devo eseguire diverse attività di recupero e classificazione delle informazioni su un set di dati molto grande. Una piccola raccolta avrebbe documenti 10K. Da ogni documento circa 100 vettori di 150 dimensioni di doppi. Quindi circa 1 milione di vettori di 150 doppi o 150 milioni di doppi. Dopo averlo memorizzato, ho bisogno di richiamarli tutti O una percentuale di essi ed eseguire il clustering (ad esempio KMEANS). Le collezioni effettive hanno molti più documenti (attualmente mi occupo di documenti 200K).Il modo migliore per archiviare e recuperare set di dati di grandi dimensioni con Java

Naturalmente mi sono occupato di OutOfMemoryError più volte e la mia ultima soluzione al problema è stata la memorizzazione in 10 enormi file XML con dimensioni totali> 5 GB. I file dovevano essere 10 perché DOM Writer aveva la memoria piena. Per la lettura ho usato SAX Parser che ha fatto il lavoro senza caricarli in memoria. Inoltre, la memorizzazione di una doppia in qualsiasi tipo di testo moltiplica le sue dimensioni effettive e aggiunge il costo computazionale di analisi e conversione. Infine, gli algoritmi di clustering sono di solito iterativi, quindi avranno bisogno degli stessi dati ancora e ancora. Il mio metodo non ha memorizzato nella cache nulla, ha solo letto dal disco molte volte.

Attualmente sto cercando un modo più compatto di memorizzare qualsiasi quantità di dati in formato binario (database, file binario non elaborato, ecc.) E un modo efficace di leggerli. Qualcuno ha qualche idea da proporre?

risposta

4

Database incorporato o memorizzazione di valori-chiave. Ce ne sono molti, ad es. JDBM3. E che strana idea di memorizzare in formato xml? Si potrebbe semplicemente scaricare una matrice su un file usando la tecnica di serializzazione standard.

+1

JDBM3 è stato aggiornato a JDBM4, meglio noto come [MapDB] (http://www.mapdb.org/). –

0

Non utilizzare Derby per questo scopo. La memorizzazione di più di 500k voci è molto lenta e utilizza troppa memoria

1

Non sono così sicuro del tuo caso, ma per le nostre esigenze di "gestione di grandi quantità" abbiamo usato DB non SQL e ha funzionato abbastanza bene.

+0

Estenderò questa risposta con l'approccio Big Data in generale. Cerca di hadoop per elaborare file di grandi dimensioni e database NoSQL (per @jakub.petr) per contenere quei dati –

0

I datagrids in memoria possono risolvere il tuo problema. Sono disponibili diverse soluzioni open source (Hazelcast, Infinispan).

Ho lavorato solo con il nocciolo ancora, quindi non posso dirti nulla degli altri.

Hazelcast diffonde i dati su più nodi. Le query vengono anche distribuite su tutti i nodi nel cluster.

Problemi correlati