2013-01-05 9 views
7

Ho bisogno di memorizzare molti dati (oggetti) in memoria (per i calcoli).
Poiché i calcoli vengono eseguiti sulla base di questi dati, è fondamentale che tutti i dati risiedano nella stessa memoria di processo JVM.
La maggior parte dei dati verrà creata da stringhe, numeri interi e altri sottooggetti (raccolte, hashset, ecc.).
Poiché l'overhead della memoria degli oggetti Java è significativo (le stringhe sono UTF-16, ogni oggetto ha un sovraccarico di 8 byte) Sto cercando librerie che consentano di archiviare tali dati in memoria con un sovraccarico inferiore.
Ho letto articoli interessanti circa la riduzione della memoria:
* http://www.cs.virginia.edu/kim/publicity/pldi09tutorials/memory-efficient-java-tutorial.pdf * http://blog.griddynamics.com/2010/01/java-tricks-reducing-memory-consumption.htmlRidurre al minimo l'overhead della memoria dei dati dell'applicazione nei processi java

Mi stavo chiedendo se c'è qualche libreria per tali scenari là fuori o avrò bisogno di ripartire da zero.
Per comprendere meglio il mio requisito, immagina un server che elabora un volume elevato di record e deve analizzarli in base a milioni di altri record che sono archiviati in memoria (per un'alta velocità di elaborazione).

risposta

5

per l'overhead della raccolta dare un'occhiata a trove - il sovraccarico della memoria è inferiore rispetto alle classi di raccolte predefinite (in particolare per le mappe e i set che, nel JDK sono basati sulle mappe).
se si dispone di oggetti di grandi dimensioni, potrebbe essere utile salvarli "serializzati" come una rappresentazione binaria compatta (non serializzazione java) e deserializzare di nuovo su un oggetto completo quando necessario)
si potrebbe anche utilizzare una libreria cache che può pagina fuori sul disco? dare un'occhiata a infinispan o ehcache. inoltre, alcune di queste librerie (ehcache tra loro, se la memoria serve) forniscono "memoria off-heap" come parte del processo di jvm - un blocco di memoria non soggetto a GC gestito dalla libreria (nativa). se si dispone di una rappresentazione binaria efficiente, è possibile archiviarla (non abbassare il footpring ma potrebbe comportarsi meglio)

+0

Grazie! la libreria trove sembra grande. Conosce qualche libreria per ridurre il sovraccarico delle stringhe? –

+0

non proprio. eccetto che per memorizzare le stringhe ascii come binarie e "deserializzarle", non c'è nulla che io sappia che tu possa fare - java ha solo una rappresentazione di stringa interna e questo è unicode. – radai

+0

beh, ora che ci penso un po 'di più, se quelle stringhe si ripetono, potresti intern() per ottenere un'istanza univoca, ma il rovescio della medaglia è che il pool di quelle istanze uniche risiede nel permgen (almeno in java 6) e non è pulito, quindi potresti perdere. se si ripete davvero, potresti aggiungere il tuo pool di stringhe unico – radai

0

Per quanto riguarda le stringhe, esaminare anche l'opzione -XX: + UseCompressedStrings jvm, ma sembra che sia stata eliminata da ultimi aggiornamenti jvm, vedere this other question

1

Per il bit di stringa è possibile memorizzare il byte [] ottenuto da String.getBytes ("UTF8"). Se richiedi nuovamente un oggetto String, puoi quindi crearlo nuovamente da ByteArray. Naturalmente sarà necessario un po 'di CPU per creare gli oggetti String più e più volte, quindi sarà un compromesso tra la dimensione < -> velocità.

Problemi correlati