2009-07-17 6 views
1

Dies ist wahrscheinlich entlang der Linien ist von .NET Collections and the Large Object Heap (LOH)Large Object Heap mit XML-Dokumenten

In .Net, ich lade ein XmlDocument mit einer Zeichenfolge, die ~ 200 KB Textdokument macht, wenn die XML Base64 umgewandelt wird. Der Punkt ist, dass die Zeichenfolge dem großen Objekt-Heap zugewiesen werden sollte. Ich weiß aus Vergleichen hier lesen, dass der XmlReader der effizienteste Weg ist, die Zeichenfolge zu lesen, aber das XmlDocument gibt mir wahrscheinlich das direktere Lesen mit mehr Funktionalität (xpath).

Jeder Knoten meines XML sollte eine ziemlich kleine Zeichenfolge sein, nichts in der Nähe des Heapspeichers für große Objekte. Mit Lutz .Net Reflector erscheint das XmlDocument intern mit verknüpften Knoten.

Also endlich, meine Frage: Wird das Laden dieser Zeichenfolge, die ~ 200 KB (> 85000 Bytes) speichert, verursachen ein anderes Objekt auf die LOH, wenn XmlDocument verwendet. Wir sind ein wenig besorgt darüber, den Heap zu fragmentieren und zu OOM-Fehlern zu führen. Oder schafft das XmlDocument (zumindest für den Fall von Daten, über die ich frage) zufällig eine Menge von Objekten für den verwalteten Heap?

Antwort

1

Warum laden Sie den XML-Code zu Beginn in eine Zeichenfolge? Woher kommen die Daten? Kannst du das nicht (Stream oder TextReader) direkt in XmlDocument übergeben, um damit zu beginnen?

+0

Die Zeichenfolge stammt aus der Datenbank. Wir bauen eine vertikale Markt-App auf der Microsoft Dynamics-Plattform auf, sodass die Verwendung anderer Arten von Datenbankfeldern für mich keine Option darstellt. –

+0

Um klarer zu sein, stammt die Zeichenfolge vom Dynamics-Webdienst, der sie aus der Datenbank abgerufen hat. –

+0

Wenn es von einem Webdienst kommt, holen Sie es in einer HTTP-Anfrage ab? Wenn Sie die Kontrolle darüber haben, können Sie vielleicht das Ergebnis streamen - wenn nicht, sind Sie im Grunde verpflichtet, diese 200K-Zeichenfolge trotzdem im Speicher zu haben. –

3

Es ist nur Objekt von kontinuierlichen Daten, die größer als 85 KB ist, die in den großen Objekten Haufen endet. Zum Beispiel große Strings und Arrays mit zehntausend Elementen.

Ein XmlDocument besteht aus einer Menge kleiner Objekte, so dass es sehr selten etwas auf dem Heap großer Objekte zuweisen wird. Die einzige Chance dafür ist, wenn ein Knoten zehntausende von Kindern enthält oder wenn ein Wert länger als 42500 Zeichen ist.