Wie serialisieren große Objekte .NET? (OutOfMemory-Ausnahmen)
Ich bin mit der Serialisierung, die für die "save" - feature in meiner Anwendung. Aber wenn die Daten zu groß (15 MB) ich fange an, OutOfMemory-exceptions.
Habe ich so viele Objekte, und Sie sind verbunden mit anderen kleinen Objekten, ich denke, das verursacht zu viel Rechenleistung und Daten im Speicher.
Mein code basiert auf diesem, fast die gleichen:
http://www.codeproject.com/KB/vb/TreeViewDataAccess.aspx
Edit :
- Ich nicht das verwenden einer benutzerdefinierten Serialisierung, es ist alles selbst gemacht, [Serialization] - Attribute. Mit Ausnahme einiger Felder.
- Ich serialisieren so viele Objekte und benutzerdefinierte Klassen. Enthält ein Wörterbuch, Strukturen und paar andere Sachen.
- Ich serialisieren in eine Datei.
- Benutze ich XmlSerializer
P. S. ich habe 4 GB physischen Speicher.
Lösung
Danke für die Antworten, mein problem war gefunden zu sein, mit XmlSerializer und ich habe, um es loszuwerden. Binäre Serialisierung ist gut arbeiten mit den Daten die ich habe.
Welche Art von Objekt handelt es sich? Und was Serialisierungs-framework verwenden Sie? Ist die Daten-Struktur? oder ein Diagramm? (d.h. gibt es mehr als eine route zu einem beliebigen Objekt)?
Es ist so viele verknüpfte Objekte, darunter viele benutzerdefinierte Klassen sowie ein treeview 🙂
Ich bin nicht mit einem speziellen framework verwenden .NET-Serialisierung (.NET Framework 2.0).
aber Sie Kreuz verbunden... das hat Auswirkungen...
Gute Frage, Sie könnten tatsächlich. Ich habe den Faden verloren. Tun .NET duplizieren Sie Sie stattdessen, herauszufinden, links?
Es ist so viele verknüpfte Objekte, darunter viele benutzerdefinierte Klassen sowie ein treeview 🙂
Ich bin nicht mit einem speziellen framework verwenden .NET-Serialisierung (.NET Framework 2.0).
aber Sie Kreuz verbunden... das hat Auswirkungen...
Gute Frage, Sie könnten tatsächlich. Ich habe den Faden verloren. Tun .NET duplizieren Sie Sie stattdessen, herauszufinden, links?
InformationsquelleAutor dr. evil | 2009-04-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
15MB sollte nicht geben Ihnen einen OOM.
Wenn die Daten wie ein Baum (und nicht als eine vollständige graph), sollten Sie erwägen, einen serializer wie protobuf-net; sowie die Verwendung von Google sehr effizient (sowohl Geschwindigkeit und Speicher) Binär "protocol buffers" - format, profitiert es von nicht mit zu tun Referenz-tracking (für die Diagramme) - was bedeutet, dass es nur darum kümmern, die Daten einmal (zweimal, wenn es um gepuffert).
Dies erfordert jedoch verschiedene markup, um Ihre Klassen (oder zumindest ein "opt-in") - und es wird nicht mit voll-Graphen. Aber es ist da, und...
InformationsquelleAutor Marc Gravell
Ich hatte genau das gleiche problem. Der Grund ist, dass .NET
Serialisierung nicht skaliert.
Ich löste das problem, indem Sie Simon Hewitt ist ausgezeichnet öffnen
source-Bibliothek finden Sie unter Optimierung der Serialisierung in .NET - Teil
2.
Außerdem reduzieren Sie die Speicherauslastung ist auch viel
schneller. Ähnlich wie der Artikel, den ich habe eine Geschwindigkeit-bis 20-mal.
InformationsquelleAutor Peter Mortensen
Eigentlich XmlSerializer ignoriert das SerializableAttribute Attribute. Sie sind es gewohnt, nur durch die Formatierung Klassen (BinaryFormatter, SoapFormatter).
Ich würde nicht die Serialisierung mit dem XmlSerializer, und vor allem nicht eine Kombination von XmlSerializer und BinaryFormatter.
Ich würde einfach versuchen, das zu serialisieren alles mit dem BinaryFormatter.
InformationsquelleAutor Dave Van den Eynde
Könnten Sie schreiben Ihre eigenen Serialisierungs-Routinen und sehen, ob Sie gewinnen können, alle performance-Vorteile von hand-Schneiderei Ihre Serialisierungs-Prozess. Für mehr details, siehe die MSDN-Seite auf eine Benutzerdefinierte Serialisierung.
InformationsquelleAutor Tamas Czinege
Vielleicht kannst du uns ein wenig mehr Details darüber, wie die Serialisierung erfolgt. Verwenden Sie eine benutzerdefinierte Serialisierung ? Oder haben Sie gerade verwenden der built-in [Serialization] - Attribut ?
Ich denke, dass eine gute Möglichkeit für Sie, dies zu behandeln ist, zu versuchen, Ihre benutzerdefinierte Serialisierung Logik und nur serialisieren nur, was Sie brauchen, es kann nicht gehen 4GB, aber es hängt auch davon ab, wie viel memeory Ihre Anwendung zugewiesen hat.
gut, Sie könnte auf x64 und schieben in eine Tonne Gedächtnis; aber das fühlt sich an wie es sollte nicht notwendig sein.
InformationsquelleAutor nba bogdan
Alle die Ansätze, die hier bereits erwähnt, die einfache dumping-big-Objekte auf der Festplatte und die Wiederherstellung von verloren. Auch diese unterstützen nur die dump-Datentypen, So können Sie nicht dump Referenz-Typen so leicht, als könnten Sie mit BinaryFormatter.
Tun auch Kompression mit gzip oder 7-Zip vor binäre Formatierung von großen Objekten tatsächlich bewegen sich die Größe oberhalb von 16 MB bis etwas wie 32 MB.
InformationsquelleAutor
Könnten Sie zum Download JSON.NET Bibliothek, die funktioniert in meinem Projekt mehr als 100 MB Daten-Serialisierung und-Deserialisierung.
Für die Serialisierung können Sie arbeiten wie
Wenn Sie TextWriter-Objekt
Wenn Sie Zeichenfolge verwenden StringWriter
Kann dies für Sie arbeiten.
InformationsquelleAutor Dilip0165