HashMap basato su disco
-
27-09-2019 - |
Domanda
La Java ha (o è una libreria disponibile) che mi permette di avere un disco basato HashMap? Non ha bisogno di essere atomica o qualsiasi cosa, ma sarà accessibile attraverso più thread e non deve bloccarsi se due stanno accedendo alla stesso elemento allo stesso tempo.
Qualcuno sa di qualcosa?
Soluzione
In entrambi i proprietà file o Berkeley DB potrebbe essere quello che stai cercando. java.util.Properties
si implementa java.util.Map
e fornisce i metodi per load
da e store
a un file. Il Berkeley DB è stato spesso consigliato come un peso leggero coppia chiave-valore datastore.
Altri suggerimenti
MapDB
MapDB fornisce TreeMap simultaneo e HashMap appoggiate dalla memoria su disco o off-heap-memory. Si tratta di un veloce, scalabile e facile da usare integrato motore di database Java. Esso è dotato di caratteristiche quali operazioni, spazio serializzazione efficiente, cache esempio e trasparente compressione / codifica. Ha anche prestazioni eccezionali paragonabile solo a motori DB incorporati nativi.
jdbm2
database integrato Chiave Valore Java.
Sembra che avete bisogno qualcosa di simile a un db leggero. Hai guardato / considerati Java DB? un DB di luce con un'unica tabella indicizzata sarebbe fondamentalmente un thread-safe hash_map disco.
JDBM2 è esattamente quello che stai chiedendo. Esso fornisce un HashMap sostenuta da storage su disco (tra le altre mappe). La sua veloce, thread-safe e l'API è molto semplice.
Progetto Voldemort è anche un veramente veloce / scalabile / replica "HashMap". E 'usato in una performance LinkedIn è anche piuttosto bene:
Una citazione dal loro sito:
Ecco il throughput che vediamo da un singolo client multithread parlare un singolo server in cui i dati "caldi" set è in memoria sotto artificialmente carico pesante nel nostro laboratorio prestazioni:
Legge: 19.384 req / sec
Scrive: 16.559 req / sec
Cronaca mappa implementa ConcurrentMap
e persiste dati su disco tramite mappatura di essa la memoria in un file.
Cronaca Map è concettualmente molto simile a MapDB (fornisce simile costruttore di API e l'interfaccia Map
), ma Chronicle Map è volte più veloce rispetto MapDB e ha molto meglio della concorrenza (Cronaca mappa utilizza altamente strisce multi-livello spin lock).
Quindi, l'anno è ora 2016. E se qualcuno sta cercando di affrontare questo problema, ho scoperto che il basso livello di API ambienti in Xodus da JetBrains lavora per questo stesso scopo, usando i loro computeInTransaction
lambda negozio.
Certo, non è come slick come avere un esempio Map
puro, ma ha funzionato per il mio caso d'uso.
Un'altra opzione è quella di utilizzare recente storage engine MVStore
di H2, che fa la stessa cosa, ma penso che sia più orientato verso il database stesso.
Cheers!
Nel 2018
il più leggero negozio key value
persistente è il H2 Database con il suo MVStore :
Il MVStore è un persistente, log strutturato memoria dei valori-chiave. È progettato per essere il prossimo sottosistema di H2 stoccaggio, ma può anche essere utilizzato direttamente all'interno di un'applicazione, senza utilizzare JDBC o SQL.
MVStore l'acronimo di "store multi-versione".
Ogni negozio contiene una serie di mappe che possono essere accessibili tramite l'interfaccia java.util.Map.
Sono supportate sia la persistenza basata su file e in memoria di funzionamento.
Esso è destinato ad essere veloce, semplice da usare, e di piccole dimensioni.
In concomitanza lettura e le operazioni di scrittura sono supportate.
Transazioni sono supportati (incluse le operazioni simultanee e 2-phase commit).
Lo strumento è molto modulare. Esso supporta i tipi di innesto di dati e la serializzazione, storage plug (in un file, nella memoria off-heap), implementazioni mappa innesto (B-tree, R-tree, in concomitanza B-tree attualmente), archiviazione BLOB, e un'astrazione del file system a supportare i file crittografati e zip file.
H2
è contenuta anche in una singola libreria di 1.8 meg
Ho anche guardato:
- MapDB (dipendenze
13 meg
) - cronaca-mappa (dipendenze
5.5 meg
- veloce opzionalmente distribuito) - lmdbjava (
2 meg
libreria Java dipendenze +lmdb
C) - implementazione più veloce, ma nonthread safe
fuori dal di dialogo.