Frage

Ich bin mit Serialisierung für „speichern“ -Funktion in meiner Anwendung. Aber wenn die Daten zu groß ist (mehr als 15 MB) Ich fange OutOfMemory Ausnahmen zu erhalten.

Ich habe so viele Objekte bekam und sie sind mit anderen kleinen Objekten verbunden ist, denke ich, das ist zu viel Rechenleistung und Daten im Speicher gehalten wird, verursacht wird.

Mein Code basiert auf diesem, fast gleich:

http://www.codeproject.com/KB/vb/TreeViewDataAccess.aspx

Edit:

  1. Ich verwende benutzerdefinierte Serialisierung nicht, es ist alles getan, indem [Serialisierung] Attribute. Ohne einige Felder.

  2. ich serialisiert so viele Objekte und benutzerdefinierte Klassen. Enthält Wörterbuch, Strukturen und paar andere Sachen.

  3. ich serialisiert es in eine Datei.

  4. Ich verwende XmlSerializer

P. S. Ich habe 4 GB physisches Gedächtnis.

Lösung

Dank Antworten wurde mein Problem mit XmlSerializer sein gefunden und ich habe loswerden es. Binäre Serialisierung funktioniert ganz gut mit den Daten, die ich habe.

War es hilfreich?

Lösung

15MB sollten Sie keine OOM geben.

Wenn die Daten baumartig (und nicht als eine vollständige Grafik), könnten Sie einen Serializer wie betrachten protobuf-net ; sowie mit Googles sehr effizient (Geschwindigkeit und Speichern) binären „Protokollpuffer“ -Format, profitiert sie von nicht Referenznachführmerkmal (erforderlich für Graphen) zu tun hat - was bedeutet es nur um Daten, die einmal zu sorgen hat (zweimal, wenn es hat erhalten gepuffert).

Dies erfordert jedoch verschiedene Markup Ihre Klassen (oder zumindest ein „Opt-in“) - und es wird nicht die volle grafische Darstellungen behandeln. Aber es ist da, und ...

Andere Tipps

Ich hatte genau das gleiche Problem. Der Grund dafür ist, dass .NET Serialisierung nicht skaliert wird.

Ich löste das Problem, indem sie Simon Hewitt ausgezeichnete offen mit Source-Bibliothek finden Sie unter .NET in Serialisierung Optimierung - Teil 2 .

Neben Speicherverbrauch drastisch reduziert es ist auch viel schneller. Ähnlich wie bei dem Artikel habe ich eine Beschleunigung der 20-mal.

Eigentlich ignoriert XmlSerializer die SerializableAttribute Attribute. Sie sind nur durch die Formatierungsklassen (BinaryFormatter, SoapFormatter).

verwendet

Ich würde nicht serialisiert die XmlSerializer verwenden, und schon gar nicht eine Kombination von XmlSerializer und BinaryFormatter.

Ich würde einfach versuchen, alles serialisiert die BinaryFormatter verwendet wird.

Sie können Ihre eigene Serialisierung Routinen schreiben und sehen Sie, wenn Sie irgendwelche Leistungsvorteile gewinnen können von Hand Schneiderei Ihre Serialisierung. Weitere Details, die MSDN-Seite auf Benutzerdefinierte Serialisierung .

Vielleicht können Sie uns ein wenig mehr Details darüber, wie die Serialisierung gemacht wird. Haben Sie eine benutzerdefinierte Serialisierung verwenden? Oder nutzen Sie einfach das eingebaute [Serialisierung] Attribut?

Ich denke, dass eine gute Möglichkeit für Sie, dies zu umgehen, ist zu versuchen Ihre benutzerdefinierte Serialisierung Logik zu tun und serialisiert werden nur nur, was Sie brauchen, kann es nicht zu 4 GB gehen, trotzdem es hängt auch davon ab, wie viel memeory Ihrer Anwendung zugeordnet.

Bei allen Ansätzen, die hier erwähnt werden, die Leichtigkeit des Dumpings große Objekte auf der Festplatte und Wiederherstellung verloren. Auch diese Unterstützung nur Datentypen Dump, Sie können also nicht Referenztypen so einfach wie Sie konnte mit BinaryFormatter Dump.

Auch tun Kompression gzip oder 7-Zip vor binärer Formatierung von großen Objekten über 16 MB, so etwas wie 32 MB die Größe tatsächlich bewegen.

Sie könnten herunterladen JSON.NET Bibliothek, die in meinem Projekt arbeitet mehr als 100 MB Daten der Serialisierung und Deserialisierung.

Für Serialisierung können Sie arbeiten wie

Wenn Sie Object Verwendung Textwriter

using (TextWriter textWriter = File.CreateText("LocalJsonFile.json"))
{
    var serializer = new JsonSerializer();
    serializer.Serialize(textWriter , yourObject);
}

Wenn Sie Zeichenfolge Verwendung String

  StringBuilder sb = new StringBuilder();
  StringWriter sw = new StringWriter(sb);

  using(JsonWriter textWriter = new JsonTextWriter(sw))
  {
     var serializer = new JsonSerializer();
     serializer.Serialize(textWriter, yourObject);
  }

Dies kann für Sie arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top