Ho bisogno di usare un file grande che contiene stringhe String, String e perché voglio spedirlo con un JAR, ho optato per includere una versione serializzata e gzip nella cartella delle risorse del applicazione. Ecco come ho creato la serializzazione:Java: memorizzazione di una grande mappa in risorse
ObjectOutputStream out = new ObjectOutputStream(
new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream(OUT_FILE_PATH, false))));
out.writeObject(map);
out.close();
ho scelto di usare un HashMap<String,String>
, il file risultante è 60MB e la mappa contiene circa 4 milioni di voci.
Ora, quando ho bisogno della mappa e ho deserializzare utilizzando:
final InputStream in = FileUtils.getResource("map.ser.gz");
final ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new GZIPInputStream(in)));
map = (Map<String, String>) ois.readObject();
ois.close();
Questa operazione richiede circa 10 ~ 15 secondi. C'è un modo migliore per archiviare una mappa così grande in un JAR? Lo chiedo perché uso anche la libreria Stanford CoreNLP che utilizza i file di modelli di grandi dimensioni ma sembra funzionare meglio a tale riguardo. Ho provato a individuare il codice in cui vengono letti i file del modello, ma ho rinunciato.
Cosa richiede 10 ~ 15 secondi? Scrivere o leggere la mappa? Cosa vuoi migliorare? –
Il suo secondo codice dice esplicitamente che richiede 10-15 sec per leggere il file – VLef
verificarlo per aumentare le prestazioni della serializzazione e vedere il metodo flush. http://www.drdobbs.com/jvm/increase-java-serialization-performance/240159166 –