Ich habe ein Java-Programm, das Daten in eine ziemlich komplexe und große Datenstruktur im Speicher (mehrere GB) bereitet und es auf die Festplatte serialisiert, und ein anderes Programm, das die serialisierte Datenstruktur im Speicher zurückliest. Ich war überrascht zu bemerken, dass der Deserialisierungsschritt ziemlich langsam ist und dass er CPU-gebunden ist. (100% CPU-Auslastung in top
aber nur 3 bis 5 MB/s lesen mit iotop
, die sehr niedrig ist für was sequenzielle Lesevorgänge auf einer Festplatte sein sollte). Die CPU ist relativ neu (Core i7-3820), die Struktur passt in den Speicher, kein Swap-Space ist konfiguriert.Warum ist die Deserialisierung von Java CPU-gebunden?
Warum ist das so? Gibt es eine alternative Möglichkeit, Objekte in Java zu serialisieren, die nicht die CPU als Engpass haben? Hier
ist die Deserialisierung Code, falls das wichtig ist:
FileInputStream f = new FileInputStream(path);
ObjectInputStream of = new ObjectInputStream(f);
Object obj = of.readObject();
IIRC es Reflexion Magie vergleichbar, wie die .NET-Serializer Arbeit verwendet. Das ist langsam. Es gibt einen konzeptionell einfachen, aber "viel Tipp" -Weg, um all dies zu vermeiden - tun Sie es von Hand. Das heißt, Objekte rekursiv Feld für Feld in einen binären Stream schreiben. Und umgekehrt zum Laden. – harold
Dies könnte helfen: http://vanillajava.blogspot.co.uk/2011/10/serialization-using-bytebuffer-and.html – assylias
Können Sie versuchen, den 'FileInputStream' mit einem' BufferedInputStream' zu umhüllen? –