gerade wie das Thema suggeriert Ich bin auf ein kleines Problem mit Boost :: Serialisierung beim Serialisieren einer großen Menge von Daten in eine Datei gestoßen. Das Problem besteht darin, dass der Speicher-Footprint des Serialisierungsteils der Anwendung etwa das 3 bis 3,5-fache des Speichers meiner Objekte benötigt, die serialisiert werden.
Es ist wichtig zu beachten, dass die Datenstruktur, die ich habe, ein dreidimensionaler Vektor von Basisklassenzeigern und ein Zeiger auf diese Struktur ist. Wie folgt aus:Boost :: Serialisierung hoher Speicherverbrauch während der Serialisierung
using namespace std;
vector<vector<vector<MyBase*> > >* data;
Dies wird später mit einem Code analog zu diesem serialisiert:
ar & BOOST_SERIALIZATION_NVP(data);
boost/Serialisierung/vector.hpp enthalten ist.
Klassen, die serialisiert werden, erben alle von "MyBase".
Jetzt, seit dem Start meines Projekts habe ich verschiedene Archive für die Serialisierung von typischen binary_archive, text, xml und schließlich polymorphe binary/xml/text verwendet. Jeder einzelne davon verhält sich genau gleich.
Normalerweise wäre dies kein Problem, wenn ich kleine Datenmengen serialisieren müsste, aber die Anzahl der Klassen, die ich habe, liegt in den Millionen (idealerweise etwa 10 Millionen) und der Speicherverbrauch, wie ich es testen konnte zeigt konsistent, dass der vom boost :: serialization-Teil des Codes zugewiesene Speicher ungefähr 2/3 des gesamten Speicherbedarfs der Anwendung beim Schreiben der Datei ausmacht.
Dies entspricht etwa 13,5 GB RAM für 4 Millionen Objekte, wobei die Objekte selbst 4,2 GB benötigen. Jetzt ist das so weit, wie ich meinen Code nehmen konnte, da ich keinen Zugriff auf eine Maschine mit mehr als 8 GB physikalischem RAM habe. Ich sollte auch beachten, dass dies eine 64-Bit-Anwendung ist, die auf einer professionellen Windows 7 x64-Edition ausgeführt wird, aber die Situation ist ähnlich auf einer Ubuntu-Box.
Jeder hat eine Idee, wie ich mich um die Fehlerbehebung kümmern würde, da es für mich inakzeptabel ist, so hohe Speicheranforderungen für eine Anwendung zu haben, die während des Betriebs nicht so viel Speicher verbraucht wie bei der Serialisierung.
Deserialisierung ist nicht so schlecht, da es rund 1,5 mal den benötigten Speicher reserviert. Damit könnte ich leben.
Versuchte Drehen mit boost :: archive :: archive_flags :: no_tracking deaktivieren, aber es verhält sich genau gleich.
Hat jemand eine Idee, was ich tun soll?
Einfach einchecken, um das Thema zu stoßen, da noch niemand geantwortet hat ... – Max021
Interessantes Thema. Lesen Sie dies: http: // stackoverflow.com/questions/1058051/boost-serialisierung-performance-text-vs-binary-format –
Die 'no_tracking'-Flag ist leider nicht implementiert (es gibt einige Diskussionen über den Issue Tracker darüber)./cc @MohsenTamiz – sehe