Mam program Java, który przygotowuje dane do dość złożonej i dużej struktury danych w pamięci (kilka GB) i serializuje je na dysk, a także inny program, który odczytuje zserializowaną strukturę danych w pamięci. Zaskoczyło mnie, że krok deserializacji jest dość powolny i że jest związany z procesorem. (100% użycia procesora w top
, ale tylko od 3 do 5 MB/s odczytu z iotop
, który jest bardzo niski, co powinno być sekwencyjne odczyty na dysku twardym). Procesor jest dość nowy (Core i7-3820), struktura mieści się w pamięci, nie jest skonfigurowana przestrzeń wymiany.Dlaczego powiązanie procesora Java jest zależne od procesora?
Dlaczego tak się dzieje? Czy istnieje alternatywny sposób serializowania obiektów w Javie, które nie mają procesora jako wąskiego gardła?
Oto kod deserializacji, w przypadku jest to ważne:
FileInputStream f = new FileInputStream(path);
ObjectInputStream of = new ObjectInputStream(f);
Object obj = of.readObject();
IIRC używa odbicie magicznego porównywalna do sposobu pracy NET serializers. To jest powolne. Jest koncepcyjnie łatwe, ale "dużo pisania" - aby uniknąć tego wszystkiego - rób to ręcznie. Oznacza to, że obiekty rekursywnie rekursywnie, field-by-field, do strumienia binarnego. I odwrotnie do ładowania. – harold
Może to pomóc: http://vanillajava.blogspot.co.uk/2011/10/serialization-using-bytebuffer-and.html – assylias
Czy możesz spróbować owijać 'FileInputStream' za pomocą' BufferedInputStream'? –