2010-09-30 2 views
7

Sto cercando una struttura hash persistente in java, un semplice archivio di valori-chiave, dove key è una stringa univoca e value è un int. Il valore di una chiave deve essere incrementato ogni volta che una chiave esistente viene aggiunta all'archivio.Java: grande struttura hash persistente?

Ho bisogno che questo sia abbastanza grande - possibilmente 500m - 1 miliardo di chiavi. Sto valutando tokyo-cabinet http://fallabs.com/tokyocabinet/javadoc/ ma non sono sicuro di quanto sarà scalabile: i tempi di inserimento sembrano allungarsi man mano che l'hash cresce.

Qualche idea su cosa potrebbe essere appropriato?

Grazie

Edit: Al fine di ridurre disco I/O ho intenzione di essere la memorizzazione nella cache i dati in un HashMap in memoria, quindi l'aggiornamento del hash persistente in un colpo solo quando la cache cresce fino a un certa dimensione

Edit2: Una delle ragioni per la persistenza è che ho poca RAM, 4 GB, quindi non può andare bene un grande struture in memoria.

+0

Interessante domanda. –

+0

Hai il tipo di problema che sarà limitato dalla scelta dell'hardware. Dovresti progettare il tuo software per aggirare questa limitazione, tuttavia, dato che hai solo permesso a te stesso 4 byte per voce, ne soffrirai perché le prestazioni del disco possono essere fino a 1000 volte più lente della memoria principale. –

risposta

5

I cosa Megamap è quello che stai cercando: http://megamap.sourceforge.net/. Ecco una breve descrizione di MegaMap dalla sua homepage:

MegaMap è un'implementazione Java di una mappa (o tabella hash) che può memorizzare una quantità illimitata dei dati, limitata solo dalla quantità di spazio disponibile su disco . Gli oggetti memorizzati nella mappa sono persistenti su disco . Una buona prestazione è ottenuta da una cache in memoria. Il MegaMap può, per tutti i motivi pratici , essere pensato come un'implementazione di mappa con spazio di archiviazione illimitato .

+0

Sembra interessante, lo controllerò, grazie –

+0

Grazie ancora per il suggerimento - ma sembra non mantenuto - non ha aggiornato dal 2005 :( –

+0

Vorrei dare un'occhiata a ehcache o ad altre librerie di terracota, probabilmente uno di loro può aiutarti.MegaMap è stato sviluppato sulla parte superiore di ehcache, quindi è una buona direzione per la ricerca. Forse ehcache può farlo – Skarab

2

Utilizzare un database non un hash. Anche per un database, le righe da 500 M diventano piuttosto grandi. Quanti aggiornamenti ti aspetti al secondo?

+0

Un db NoSQL sarebbe appropriato - MongoDB per esempio? Questi sono essenzialmente un negozio di valore-chiave, giusto? –

0

Quindi, se ho capito bene, Redis potrebbe essere un'opzione. È possibile emettere i comandi INCR [chiave] per incrementare atomicamente il valore associato a quella chiave. Se la chiave non esiste, viene impostata su zero e quindi incrementata (ne risulta una). Secondo lo docs, INCR è un'operazione a tempo costante. La velocità è un obiettivo primario per Redis.

Redis è in grado di persistere nel file e di controllare i parametri su come ciò accade.

+0

Suoni come Redis potrebbero dover essere adattati interamente alla memoria.Dalle note "Per essere molto veloce ma allo stesso tempo persistente, tutto il set di dati è preso in memoria". Sono limitato da 4 GB di RAM. –

+0

Ha capacità di memoria virtuale, http://code.google.com/p/redis/wiki/VirtualMemoryUserGuide. Inoltre, non deve essere eseguito localmente sullo stesso host di JVM. Naturalmente, dipende da quanta libertà la tua organizzazione ti offre in termini di ciò che puoi installare nel tuo ambiente di produzione ... – romacafe

+0

Bene, c'è questo avvertimento: "ATTENZIONE: poiché le chiavi non possono essere scambiate, Redis non essere in grado di onorare l'impostazione di vm-max-memory se le chiavi da sole utilizzano più spazio del limite. " Immagino che ti limiti Redis per te, a meno che tu non abbia una scatola davvero grande per eseguirlo ... – romacafe

0

Penso che Memcached sia una buona opzione per il tuo caso insieme a un database adatto nel back-end.