C# : die close-Methode von Xml.Load(Datei)
Ich geschrieben habe einige code, lädt ein XML-Dokument mit einem XmlDocument
Objekt, so dass es zählen die Knoten. Hier ist die Methode:
XmlDocument xml = new XmlDocument();
xml.Load(textBox1.Text);
XmlNodeList nodes = xml.SelectNodes("//File");
foreach (XmlNode node in nodes)
{
number_of_childs++;
}
Das problem, das ich bin vor ist, beim importieren einer großen Datei dauert es wie 700MB RAM. Wenn ich dann versuchen zu tun, einige Betrieb auf die Datei, Lesen oder sogar aus, um seine Daten anzuzeigen, die in einem ListView
erfolgt die Anwendung wie 2 GB RAM. Also, ich Frage mich, gibt es eine Methode, schließt die XmlDocument
befreit und seine Erinnerung, die Freigabe der RAM. Es ist wie es ist, vergessen zu entfernen, dessen Inhalt aus dem Gedächtnis.
InformationsquelleAutor R.Vector | 2012-06-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht. Die
XmlDocument
Klasse nicht implementiertIDisposable
, so gibt es keinen Weg, um ihn zu zwingen, es zu veröffentlichen Ressourcen. Wenn Sie wirklich brauchen, um sofort den Speicher frei verwendetXmlDocument
, der einzige Weg, das zu tun, wäre Folgendes zu tun:Der garbage collector arbeitet in einem separaten thread, so kann es immer noch nicht sofort geschehen. Zu zwingen, die garbage collection auftreten, synchron, bevor Sie fortfahren Ausführung des Codes, müssen Sie auch anrufen
WaitForPendingFinalizers
als solche:XmlDocument
immer lädt das gesamte Dokument in den Speicher auf einmal. Wenn Sie wollen einfach nur Durchlaufen und die Knoten in das Dokument als einen Strom, der nur das laden ein wenig in einer Zeit, das ist das, was dieXmlReader
Klasse ist. Jedoch verlieren Sie eine Menge von Funktionen, die Art und Weise. Für Instanz, es gibt keine Möglichkeit zum auswählen von Knoten mittels XPath, wie Sie wo in Ihrem Beispiel. MitXmlReader
Sie haben zu schreiben, Ihre eigene Logik, um zu bestimmen, wo im Dokument Sie sich befinden und ob das dem entspricht, was Sie suchen.siehe mein edit.
Ja es hat funktioniert , aber der zweite Schritt der app zu Lesen ist, jeden Knoten, und geben Sie es in ein listview -, so Problem immer noch vorhanden ist , aber was ist, wenn ich Lesen kann jeder Knoten des xml-und frei - Raum, aus dem Gedächtnis, wenn es erfolgreich war irgendwo gespeichert <<<, der Weg wäre besser für die Verwaltung des Speichers.
Mein Beispiel macht genau das tun. Wenn gibt den Speicher, der zum laden der XML, aber offensichtlich die Listenansicht-Steuerelement, wäre immer noch die Verwendung von Speicher zum speichern der Daten in der Liste Elemente. Übrigens, haben Sie ernsthafte performance-Probleme mit dem Speicher zu verwenden, oder sind Sie nur bemerken, dass die Speicher nach oben gehen, und es stört halt deine Prioritäten? Wenn es nur Ihre Gefühle, Sie müssen sich daran gewöhnen, ihn zu ignorieren. Da .NET verwendet garbage collection, Ihre Anwendung Speicherverbrauch schwanken alle über dem Platz, die scheinbar zufällig. Das ist normal und zu erwarten. Sie sollten sich keine sorgen machen, es
Oops. Ich habe vergessen zu setzen, Knoten zu null in meinem Beispiel.
InformationsquelleAutor Steven Doggart
Wenn Sie nicht über die zum Bearbeiten der XML, Lesen Sie einfach die XML mit XMLReader, das ist oneway und die schnellsten, mit weniger Speicher-Intensive operation.
InformationsquelleAutor Furqan Hameedi
Gibt es keine Notwendigkeit, um Ihr Objekt auf null. Die GC sollte in der Lage sein, um anzuzeigen, wenn das Dokument nicht verwendet werden, jeder weitere eigene. Dies geschieht automatisch als Speicher benötigt wird, aber wenn Sie wollen, um es zu deaktivieren rufen Sie sofort GC.Sammeln(). Sehen dieser thread für die weitere Diskussion.
Doggart, deine Aussage gilt allerdings nur in Debug-builds. In Release-builds, die Einstellung auf null ist nicht notwendig-die GC ist smart genug, um zu sehen, dass es nicht mehr referenziert wird, ohne es zu null. Siehe stackoverflow.com/questions/5545288/... zum Beispiel.
Das ist überraschend und interessant. Ist, da die Freigabe erstellen, wird standardmäßig enthält zusätzliche Optimierungen, die würde automatisch die variable, um
null
sobald es nicht mehr benutzt wird, oder so?Ich glaube, es ist nur, dass die variable als nicht mehr referenziert wird nach seinem letzten Einsatz. Ich würde nicht erwarten, dass die Release-Version, fügt im code wird die variable auf null. Es ist eher so, dass die debug-build bewirkt, dass die Referenz auf zu existieren, mehr als die wäre es natürlich, zu ermöglichen, ein Blick auf die variable im debugger.
Hier ist der Beispiel-app, die zeigt Ihnen verschiedene Bestell-zwischen Debug und Release: codepad.org/zmI3vBlQ.
InformationsquelleAutor Fr33dan