Ich muss eine große Datei verwenden, die String, String - Paare enthält, und weil ich es mit einem JAR versenden möchte, entschied ich mich, eine serialisierte und gziped Version in den Ressourcenordner der Anwendung. Dies ist, wie ich die Serialisierung erstellt:Java: Speichern einer großen Karte in Ressourcen
ObjectOutputStream out = new ObjectOutputStream(
new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream(OUT_FILE_PATH, false))));
out.writeObject(map);
out.close();
ich HashMap<String,String>
verwenden gewählt haben, ist die resultierende Datei 60MB und die Karte enthält etwa 4 Millionen Einträge.
Nun, wenn ich brauche die Karte, und ich deserialisieren es mit:
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();
dies dauert etwa 10 bis 15 Sekunden. Gibt es eine bessere Möglichkeit, eine so große Karte in einem JAR zu speichern? Ich frage, weil ich auch die Stanford CoreNLP-Bibliothek verwende, die selbst große Modelldateien verwendet, aber in dieser Hinsicht besser zu funktionieren scheint. Ich habe versucht, den Code zu finden, wo die Modelldateien gelesen werden, gab aber auf.
Was dauert 10 ~ 15 Sekunden? Schreiben oder Lesen der Karte? Was möchtest du verbessern? –
Sein zweiter Code sagt ausdrücklich, dass es 10-15sec dauert, um die Datei – VLef
zu lesen, um die Serialisierungsleistung zu erhöhen und die Flush-Methode zu sehen. http://www.drdobbs.com/jvm/increase-java-serialization-performance/240159166 –