Sto tentando di caricare file CSV di grandi dimensioni (in genere 200-600mb) in modo efficiente con Java (meno memoria e il più rapido accesso possibile). Attualmente, il programma sta utilizzando un elenco di array di stringhe. Questa operazione è stata precedentemente gestita con un programma Lua utilizzando una tabella per ogni riga CSV e una tabella per contenere ciascuna tabella "riga".Java: come archiviare in modo efficiente una grande quantità di array di stringhe
Di seguito è riportato un esempio delle differenze di memoria e tempi di caricamento:
- CSV file - 232mb
- Lua - 549mb in memoria - 157 secondi per caricare
- Java - 1,378mb in memoria - 12 secondi per caricare
Se ricordo correttamente, gli elementi duplicati in una tabella Lua esistono come riferimento al valore effettivo. Sospetto nell'esempio Java, l'elenco contiene copie separate di ogni valore duplicato e potrebbe essere correlato all'utilizzo della memoria più grande.
Di seguito alcuni retroscena sui dati all'interno dei file CSV:
- Ogni campo è costituito da una stringa
- campi specifici all'interno di ogni riga possono includere uno di un insieme di stringhe (campo Eg 3 potrebbe essere "rosso", "verde" o "blu").
- Ci sono molte stringhe duplicate all'interno del contenuto.
seguito sono riportati alcuni esempi di ciò che può essere richiesto dei dati caricato:
- una ricerca tra tutte le stringhe che tentano di abbinare con una determinata stringa e restituire le stringhe corrispondenti
- Incontri visualizzare in una GUI tabella (ordinamento in grado tramite campi).
- Modificare o sostituire stringhe.
La mia domanda: c'è una raccolta che richiede meno memoria per contenere i dati e offre ancora funzionalità per cercare/ordinare i dati in modo facile e veloce?
se si sa che colonna 3 vale solo pochi valori possibili, si potrebbe [stagista loro] (http://docs.oracle .com/javase/7/docs/api/java/lang/String.html # intern% 28% 29) per ridurre l'utilizzo della memoria. Vedi anche: http://stackoverflow.com/a/1855195/829571 – assylias
Grazie assylias eseguirò alcuni test usando quello. Sai se è efficace per le stringhe brevi - E.g. "A" o "Vai". La maggior parte dei campi contiene stringhe di 45 caratteri +, tuttavia alcuni sono piuttosto brevi (4 o meno). – user1816198
Dai un'occhiata a http://stackoverflow.com/questions/12792942/alternatives-to-java-string-interning –