Frage

Ich brauche eine XML-Datei zu analysieren, die praktisch ein Bild von einer wirklich großen Baumstruktur, so dass ich bin mit der XmlReader Klasse den Baum ‚on the fly‘ zu füllen. Jeder Knoten übergeben wird nur das XML-Chunk es über die ReadSubtree () Funktion von seinem übergeordneten erwartet. Dies hat den Vorteil, nicht zu befürchten haben, wenn ein Knoten alle seine Kinder verbraucht hat. Aber jetzt frage ich mich, ob dies wirklich eine gute Idee ist, da könnte es Tausende von Knoten und während der .NET-Quelldateien zu lesen Ich habe festgestellt, dass ein paar (und wahrscheinlich mehr) neue Objekte mit jedem ReadSubtree Aufruf erstellt werden, und kein Caching für wiederverwendbare Objekte wird (die ich gesehen habe).

Vielleicht ReadSubtree () wurde nicht gedacht, um massiv verwendet werden, oder vielleicht bin ich beunruhigend nur für nichts und ich brauche nur GC.Collect () aufrufen, nachdem die Datei Parsen ...

Hope jemand etwas Licht auf diesem verschütten kann.

Vielen Dank im Voraus.

Update:

Danke für die schönen und interessante Antworten.

Ich hatte einen tieferen Blick auf dem .NET-Quellcode und ich fand es komplizierter zu sein, als ich zum ersten Mal vorgestellt. Ich habe aufgegeben schließlich die Idee, diese Funktion in diesem Szenario ruft. Wie Stefan wies darauf hin, ist die XML-Leser nie an Außenstehende weitergegeben und ich kann dem Code vertrauen, die den XML-Stream analysiert, (die von mir geschrieben), so dass ich lieber jeden Knoten für die Datenmenge verantwortlich zu sein zwingt sie stiehlt aus dem Strom als mit dem nicht-so-thin-in-the-End ReadSubtree () -Funktion nur ein paar Zeilen Code speichern.

War es hilfreich?

Lösung

ReadSubtree () gibt Ihnen einen XmlReader, die die ursprünglichen XmlReader wickeln. Dieser neue Leser scheint für die Verbraucher als komplettes Dokument. Dies könnte wichtig sein, wenn der Code, den Sie den Teilbaum passieren zu denkt, es ist ein eigenständiges XML-Dokument zu bekommen. Zum Beispiel beginnt die Depth-Eigenschaft des neuen Reader auf 0 out Es ist eine ziemlich dünne Hülle, so dass Sie noch mehr Ressourcen nicht als verwenden würden Sie, wenn Sie die ursprünglichen XmlReader direkt verwendet, in dem Beispiel, das Sie gab, ist es eher wahrscheinlich, dass Sie viel aus dem Teilbaum Leser nicht wirklich bekommen.

Der große Vorteil in Ihrem Fall wäre, dass der Unterbaum Leser nicht zufällig vorbei an der Unterstruktur lesen können. Da der Unterbaum Leser nicht sehr teuer ist, könnte die Sicherheit genug sein, obwohl es in der Regel mehr hilfreich ist, wenn Sie die Unterstruktur benötigen wie ein Dokument zu suchen oder Sie den Code nicht vertrauen, nur seinen eigenen Unterbaum zu lesen.

Wie zu erkennen, wollen Sie nie GC.Collect () aufrufen. Es wird nie die Leistung verbessern.

Andere Tipps

, um die Annahme zu machen, dass alle Objekte auf dem normalen verwalteten Heap erstellt werden, und nicht der große Objekt-Heap (dh weniger als 85k), soll es wirklich kein Problem hier sein, das ist genau das, was der GC entwickelt wurde, zu beschäftigen.

Ich würde vorschlagen, dass es auch keine Notwendigkeit GC.Collect am Ende des Prozesses, wie in fast allen Fällen so dass der GC Zeitplan Sammlungen zu nennen selbst es in der optimalen Weise (siehe diese Blog-Post für eine sehr detaillierte Erklärung der GC, die so viel erklärt besser als ich kann).

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