Laden...

Geordnetes XML-File effizient durchsuchen

Erstellt von SeeQuark vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.627 Views
SeeQuark Themenstarter:in
946 Beiträge seit 2008
vor 15 Jahren
Geordnetes XML-File effizient durchsuchen

verwendetes Datenbanksystem: XML

Hallo Community

Ich habe ein XML-File, ähnlich einem Dictionary, in dem ich die Daten geordnet ablege. Da es sehr viele sein können, möchte ich nicht das ganze File einlesen, sondern nur einzelne Zeilen.
Die Struktur sieht so aus (Key ist eine Zahl):


<Tag Key="1" Value1="..." Value2="..."/>
<Tag Key="2" Value1="..." Value2="..."/>
<Tag Key="5" Value1="..." Value2="..."/>
<Tag Key="7" Value1="..." Value2="..."/>
<Tag Key="9" Value1="..." Value2="..."/>
<!-- und noch viel mehr -->

Wenn ich jetzt nach dem Tag mit dem Key=(&quot;5&quot;){darkred} suchen möchte, könnte ich alle Zeilen von oben nach unten auslesen, aber wenn der Key=(&quot;8&quot;){darkred} wäre, müsste ich ja alle Zeilen auslesen, bevor ich feststellen kann, ob er existiert. Ich kenne übrigens den maximalen Wert und den minimalen Wert von Key. Da wäre es doch sinnvoller, erst nach einer Schätzung der Position nach dem Key zu suchen und dann nach oben und unten zu manövrieren (wieder Schätzungsbasierend).

Könnte ich da ein Standardsuchverfahren verwenden oder ein vorhandenes verwenden, oder muss ich das selbst proggen?
Ist es überhaupt effizient, die Leseposition andauernd zu versetzen?
Soll ich einen XML-Reader oder einen TextReader verwenden?
Kann oder sollte ich mich darauf verlassen, dass Key=(&quot;...&quot;){darkred} am Anfang des Tags steht?
Ist es überhaupt sinnvoll, eine Ordnung vorauszusetzen?

Ich hoffe, ihr gebt mir ein paar Tipps, wie ich XML-Dateien durchsuche.
Vielen Dank schon im Voraus

See Sharp

5.742 Beiträge seit 2007
vor 15 Jahren

Hallo See Sharp,

in deinem Fall würde ich das ganze über XPath lösen.
Das soll sehr schnell sein (soll, weil ich mich bisher nie mehr als theoretisch damit beschäftigt habe).

Siehe hierzu Verarbeiten von XML-Daten mithilfe des XPath-Datenmodells.

Allerdings ist nur lesender Zugriff möglich, was aber in deinem Fall kein Problem zu sein scheint.

Da wäre es doch sinnvoller, erst nach einer Schätzung der Position nach dem Key zu suchen.

Das würde ich nicht empfehlen.
Alleine durch Whitespaces kann die Dokumentenstruktur sehr stark variieren.

Kann oder sollte ich mich darauf verlassen, dass Key="..." am Anfang des Tags steht

Das würde ich dir nicht raten.
Dann wären die Vorteile von XML als plattformunabhängiges und standardtisiertes Format schnell zunichte gemacht.
Wenn das keine Rolle spielt, würde sich ein binäres Format zum Speichern der Daten eher anbieten. Dann kannst du auch genaue Aussagen über die Positionen der Daten treffen.

1.346 Beiträge seit 2008
vor 15 Jahren

Ich habe schon mal ausprobiert wie schnell XmlDocument bei vielen Elementen ist.
Dazu habe ich eine Datei mit ca. 999.000 Zeilen Xml gefüllt. Er hat sie in einem Bruchteil einer Sekunde geladen. Also ich würde mir nochmal überlegen ob ich auf das XmlDocument verzichte. Das nochmal so als Denkansatz.

pdelvo

SeeQuark Themenstarter:in
946 Beiträge seit 2008
vor 15 Jahren

Hallo und Danke für die Einsichten.

Allerdings ist nur lesender Zugriff möglich, was aber in deinem Fall kein Problem zu sein scheint.

Jein, ich möchte beides. Wobei das Schreiben jedoch länger dauern kann, die Hauptsache ist das Lesen.

Dann wären die Vorteile von XML als plattformunabhängiges und standardtisiertes Format schnell zunichte gemacht.
Wenn das keine Rolle spielt, würde sich ein binäres Format zum Speichern der Daten eher anbieten. Dann kannst du auch genaue Aussagen über die Positionen der Daten treffen.

Ich möchte ja ein standardtisiertes Format, nur wusste ich nicht, ob man darauf schnell genug zugreifen kann.

Dazu habe ich eine Datei mit ca. 999.000 Zeilen Xml gefüllt. Er hat sie in einem Bruchteil einer Sekunde geladen.

999.000 Zeilen sollten reichen, nur sind diese recht nichtsaussagend. Die Zeilen in meinem Fall werden schon so ca. 250 Zeichen beinhalten.
Ausserdem spielt der Computer noch eine Rolle.

Ich habe ein bisschen gegooglet und festgestellt, dass XML sehr schnell sein soll.
Ich war vorher zu fest auf Suchalgorythmen eingeengt.

Dann kann ich meine automatische Ordnung einstellen.
Jetzt stellt sich nur noch die Frage, ob es einen grossen Unterschied macht, auf das Dokument nur lesend, oder mit Lese- und Schreibzugriff zuzugreifen.

See Sharp

Y
238 Beiträge seit 2005
vor 15 Jahren

Hallo See Sharp,

folgendes Dokument scheint deine letzte Frage ganz gut zu beantworten. Zugegeben es ist schon etwas älter aber dennoch sehr empfehlenswert da es ganz klar die Richtung angibt. Linq to Xml ist darin natürlich nicht behandelt - ich habe aber gelesen dass es performanter als XmlDocument ist.

Gruß

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo zusammen,

XmlDocument ist eines der langsamsten Art XML Dokumente zu verarbeiten. Dafür ist der Datenzugriff sehr bequem.

Das performanteste ist der XmlReader, der Zeilen- bzw. Tagweise das Dokument durchsteigt.

Es hängt aber vom Anwendungsfall ab:

  1. Ich möchte ein XML Dokument verarbeiten, dessen Struktur ich genau kenne und ich muss nicht im Dokument hin- und herspringen (z.B. einmliges, vollständiges Einlesen) -> XmlReader

  2. Ich kenne die Datenstruktur nicht genau, und / oder muss im Dokument des öfteren Suchen bzw. mal diesen Knoten auslesen (ändern), mal diesen -> XmlDocument
    [Einschränkung: z.B. ist das Einlesen eines XmlDocuments für sehr große Xml-Dateien extrem langsam, da es die komplette Struktur erst einmal analysiert. Es gibt hier auch Grenzen, wo das einfach nicht mehr vertretbar ist, da hilft einem nur noch der XmlReader]

Eine Struktur wie von See Sharp gepostet und die Frage nach Performance, lässt sehr stark Richtung 1) ausschlagen. Probier das Mal aus.

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”