Was ist der Schnellste Weg zum laden von XML-Daten in ein XDocument?
Beim erstellen einer neuen XDocument
mit XDocument.Load
ist, tut es die XML-Datei öffnen und halten eine lokale Kopie, oder tut es ständig Lesen das Dokument von der Festplatte? Wenn es nicht ständig Lesen, ist es ein schneller Weg, um XML zu Parsen?
XDocument x = XDocument.Load("file.xml");
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar Messungen zu berücksichtigen:
Antwort unmittelbar die Frage:
XDocument
verwendet eineXmlReader
laden das Dokument in den Speicher durch das Lesen jedes element und erstellen entsprechendeXElement
Instanzen (siehe code unten). Als solche, sollte es ganz schnell (schnell genug für die meisten Zwecke), aber es kann verbrauchen eine große Menge an Speicher beim Parsen ein großes Dokument.Einer raw -
XmlReader
ist eine ausgezeichnete Wahl für traversal wenn sich Ihre Bedürfnisse sind begrenzt auf das, was getan werden kann, ohne dass das Dokument im Speicher. Sie besser abschneiden werden als andere Methoden, da keine signifikanten Struktur erstellt wird noch behoben mit Bezug zu anderen Knoten (z.B. Verknüpfung von Eltern-und Kind-Knoten). Jedoch on-demand query-Fähigkeit ist fast nicht existent; Sie reagieren können, um Werte in den einzelnen Knoten, aber Sie können keine Abfrage das Dokument als ganzes. Wenn Sie brauchen, betrachten Sie das Dokument ein zweites mal, Sie Durchlaufen die ganze Sache wieder.Durch Vergleich, ein
XDocument
wird länger dauern, Sie zu durchqueren, denn es erzeugt neue Objekte und führt grundlegende strukturelle Aufgaben. Es wird verbrauchen auch Speicher im Verhältnis zur Größe der Quelle. Im Austausch für diese trade-offs, gewinnen Sie hervorragende Abfrage-Fähigkeiten.Kann es möglich sein, kombinieren die Ansätze, wie erwähnt von Jon Skeet und hier gezeigt: Streaming In LINQ to XML Mit C# Benutzerdefinierte Iteratoren und XmlReader.
Quelle für XDocument zu Laden()
Wird es analysiert den eingehenden Datenstrom (egal ob es aus einer Datei oder einer Zeichenkette spielt keine Rolle), wenn Sie anrufen
Load()
und dann halten Sie eine lokale Instanz des Dokuments im Speicher. Da die Quelle kann alles sein (könnte ein NetworkStream -, DataReader-Objekt, eine Zeichenfolge, die vom Benutzer eingegeben), es konnte nicht gehen Sie zurück und versuchen, die Daten zu Lesen wieder, da es nicht weiß, den Zustand der it (streams werden geschlossen etc).Wenn Sie wirklich wollen, speed-auf der anderen Seite, XDocument ist nicht die fastets (obwohl es ist einfacher, mit zu arbeiten), da wird es zunächst zu analysieren das Dokument und bewahren es im Gedächtnis. Wenn Sie die Arbeit mit wirklich großen Dokumenten verwenden einen Ansatz mit System.Xml.XmlReader ist in der Regel schneller, da kann Sie Lesen, das Dokument als stream und nicht behalten müssen, also alles außer dem aktuellen element. Diese benchmark zeigt einige interessante Fakten über diese.
Ich nicht denke, dass es ständig liest; die nette Sache über die
XDocument.Load
Methode ist, dass es verwendetXmlReader
zum Lesen der XML-Daten in eine XML-Struktur. Und da jetzt, die Sie gerade erstellt einen Baum, der ist wahrscheinlich gelagert in Ihrem Gedächtnis, wie ein Baum es nicht mehr liest das Dokument ständig. Es manipuliert den Baum und da ist ein Baum, der alle Lesen und bei änderungen fertig sind, sehr viel schneller. Obwohl es nicht implementiert nichtIDisposable
es wird automatisch entsorgt.