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?

È stato utile?

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.

http://www.mapdb.org/

jdbm2

database integrato Chiave Valore Java.

https://code.google.com/p/jdbm2/

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 non thread safe fuori dal di dialogo.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top