2013-01-09 8 views
6

Ho bisogno di tenere un sacco di oggetti stringa in memoria (centinaia di MB) e voglio tenerli in formato UTF-8 poiché nella maggior parte dei casi richiede metà della memoria l'implementazione predefinita uso.
La classe String predefinita richiede una stringa di 12 caratteri di 60 byte (vedere http://blog.griddynamics.com/2010/01/java-tricks-reducing-memory-consumption.html).
La maggior parte delle mie stringhe ha una lunghezza di 10-20 caratteri.
Mi chiedo se esiste una libreria open source che offre un wrapper per tali stringhe?
So come convertire l'array di stringhe in UTF-8 ma sto cercando una classe wrapper che fornisca tutte le funzioni di utilità necessarie (Hash, Equal, toString, fromString, ecc.).Classe stringa UTF-8 per java

+2

http://docs.oracle.com/javase/tutorial/i18n/text/string.html – Doorknob

+2

Java memorizza tutte le stringhe internamente in UTF-16, quindi 12 stringhe di caratteri sono 24 byte internamente. Senza contare l'overhead dell'oggetto obbligatorio, da dove viene quella cifra di 60 byte? – fge

+0

... minimo 24 byte, poiché le codifiche UTF sono di lunghezza variabile (consentito, è necessario utilizzare alcuni caratteri seriamente esotici per superare i 24 byte nell'esempio dell'OP) –

risposta

2

Apache Avro ha una UTF8 wrapper class che implementa CharSequence, ma non so il consumo di memoria di tali oggetti

Hadoop ha il Text class che ha proprio il tipo di interfaccia che si desiderio

+0

intendevi rendere entrambi i link uguali? – AgilePro

+0

no, di sicuro :-) Ho fatto la correzione – Grooveek

0

Se si desidera un oggetto distinto per ogni stringa e vuoi che siano il più compatto possibile, quindi usa matrici di byte. Quello sarà 1 byte per char vs 2 e non si avrà il sovraccarico dell'intestazione String (che aggiunge probabilmente 32 byte per oggetto).

Ma ovviamente non sarebbe possibile utilizzare alcun metodo String su questi senza prima convertirsi in String.

Ma se si vuole veramente risparmiare spazio, è possibile memorizzare le stringhe back-to-back in alcuni array più grandi, con "dope vettori" per individuare le singole stringhe.