2011-10-09 16 views

risposta

9

sto sviluppando una soluzione per essere molto più veloce, ma non vorrei suggerire lo si utilizza appena ancora come solo un proof of concept in questa fase.

http://vanillajava.blogspot.com/2011/09/new-contributors-to-hugecollections.html

Tuttavia, se si dispone di un requisito specifico, può essere più facile di codice da soli, utilizzare ByteBuffers diretti o file mappati in memoria.

ad es.

// using native order speeds access for values longer than a byte. 
ByteBuffer bb = ByteBuffer.allocateDirect(1024*1024*1024).order(ByteOrder.nativeOrder()); 
// start at some location. 
bb.position(0); 
bb.put((byte) 1); 
bb.putInt(myInt); 
bb.putDouble(myDouble); 

// to read back. 
bb.position(0); 
byte b = bb.get(); 
int i = bb.getInt(); 
double d = bb.getDouble(); 

Si può fare in modo simile per file mappati in memoria. I file mappati in memoria non contano per il limite di memoria diretta e non utilizzano lo spazio di swap.

Sei sicuro che BigMemory non farà il lavoro per te?

+2

Vorrei uno strumento gratuito, quindi BigMemory non ha i piedi. Non è così facile codificarlo da solo perché ho bisogno di aggiungere e rimuovere dati dalla cache, quindi dovrò codificare una logica complicata simile a GC in un buffer allocato. – Tema

+1

Avanti veloce 6 anni, questo progetto è ora chiamato [Mappa Chronicle] (https://github.com/OpenHFT/Chronicle-Map) – leventov

14

C'è una soluzione cache molto buona denominata MapDB (JDBM4 in precedenza). Supporta HashMap e TreeMap ma è solo l'applicazione incorporata. Supporta anche cache persistente basata su file.

Esempio per la cache off mucchio:

DB db = DBMaker.newDirectMemoryDB().make(); 
ConcurrentNavigableMap<Integer, String> map = db.getTreeMap("MyCache"); 

o persistente file di cache basata:

DB db = DBMaker.newFileDB(new File("/home/collection.db")).closeOnJvmShutdown().make(); 
ConcurrentNavigableMap<Integer,String> map = db.getTreeMap("MyCache"); 
+1

È una soluzione con disco. Non proprio quello che sto chiedendo. – Tema

+4

@Tema: supporta entrambi. –

+0

Vale la pena ricordare che MapDB è stato sviluppato in Kotlin e imporrà una dipendenza dal suo runtime. –

8

Ho avuto questa domanda me così io sto solo andando ad aggiornare le risposte precedenti con le mie scoperte

ho trovato questa discussione dal quorum, che parla anche la stessa domanda:

http://www.quora.com/JVM/Whats-the-best-open-source-solution-for-java-off-heap-cache

La soluzione diversa, che sembra essere una buona misura, oltre al directmemory (che non è davvero stato aggiornato nel l'anno scorso) sono

  • MapDB - questo sembra essere una soluzione molto completa che fa molto di più quindi la cache off-heap e supporta un sacco di funzioni
  • enorme Collezioni - Questa applicazione sembra essere molto meno complessa di MapDB, che si concentra sull'allocazione dei dati fuori heap estendendo ConcurrentMap e Map. Un progetto di fork di questo, destinato a target Java 8, è Chronicle-Map.Un bel articolo su questo è http://blog.shinetech.com/2014/08/26/using-hugecollections-to-manage-big-data/
  • SpyMemcached - questa è un'implementazione a thread singolo molto semplice con una buona reputazione su github.
  • xmemcached - questo ha anche una buona reputazione su github ma non sembra essere molto parlato.
  • veloce serializzazione - anche focalizzata su reimplementare Java serializzazione con particolare attenzione all'utilizzo off-mucchio di memoria - http://ruedigermoeller.github.io/fast-serialization/

Tuttavia, sarei interessato, inoltre, di trovare una grande applicazione sufficiente che utilizza uno di questi tre: directmemory, SpyMemcached, xmemcached. Se dovessi trovarne uno aggiornerò questa risposta.

3

Questa implementazione di una cache java off-heap utilizza la memoria diretta e fornisce buone prestazioni in una libreria Java leggero:

https://github.com/snazy/ohc

Date un'occhiata alla sezione di analisi comparativa per i numeri delle prestazioni. È concesso in licenza con Apache 2.

Problemi correlati