2015-06-29 12 views
8

Ho bisogno di memorizzare un grande dizionario di parole in linguaggio naturale - fino a 120.000, a seconda della lingua. Questi devono essere tenuti in memoria poiché la profilazione ha mostrato che l'algoritmo che utilizza l'array è il collo di bottiglia temporale nel sistema. (Si tratta essenzialmente di un algoritmo di controllo ortografico/correzione automatica, sebbene i dettagli non siano importanti.) Sui dispositivi Android con memoria da 16 MB, l'overhead di memoria associato a Java String s ci sta causando esaurimento dello spazio. Nota che ogni String ha un 38 byte overhead associated with it, che offre un sovraccarico di 5 MB.Alternative compatte a Java ArrayList <String>

A prima vista, un'opzione è di sostituire char[] per String. (O anche byte[], in questo caso UTF-8 è più compatto in questo caso.) Ma ancora, l'overhead della memoria è un problema: each Java array has a 32 byte overhead.

Un'alternativa a ArrayList<String>, ecc. Consiste nel creare una classe con la stessa interfaccia che concatena internamente tutte le stringhe in una stringa gigantesca, ad es. rappresentato come singolo byte[], quindi memorizza gli offset in quella stringa enorme. Ogni offset richiederebbe 4 byte, offrendo una soluzione molto più efficiente in termini di spazio.

Le mie domande sono a) ci sono altre soluzioni al problema con overheads analogamente bassi * e b) è una soluzione disponibile off-the-shelf? La ricerca nelle librerie di raccolta Guava, trove e PCJ non produce nulla.

* So che si può ottenere il sovraccarico sotto i 4 byte, ma ci sono rendimenti decrescenti.

NB. Support for Compressed Strings being Dropped in HotSpot JVM? suggerisce che l'opzione JVM -XX:+UseCompressedStrings non sarà di aiuto qui.

+0

Un array può avere solo voci 2^31-1 = 2.1g, forse troppo piccola per te? – maraca

+1

No ... una parola in genere occupa ~ 10 byte, quindi l'intera struttura si adatta a ~ 1 MB. (~ 1,5 MB di spese generali.) – Mohan

+0

Hai davvero bisogno di tenere tutte le stringhe in memoria? Probabilmente puoi tenere un po 'di indice e caricare efficacemente la parte necessaria dal file? Qual è il tuo compito originale? Come usi queste stringhe? –

risposta