2010-09-29 7 views
10

etwas verwandt mit: libxml2 from javaWarum syntax Parsing schneller als Dom Parsing? und wie funktioniert stax?

ja, diese Frage ist ziemlich langatmig - sorry. Ich habe so dicht wie möglich gehalten. Ich habe die Fragen gewürdigt, um einen Blick auf das Ganze zu erleichtern.

Warum Parsing schneller als Dom Parsing? Das einzige, was ich mir vorstellen kann, ist, dass Sie wahrscheinlich den Großteil der eingehenden Daten ignorieren und somit keine Zeit verschwenden, Teile des XML zu verarbeiten, die Sie nicht interessieren. IOW - nach dem Parsen mit SAX können Sie die ursprüngliche Eingabe nicht neu erstellen. Wenn Sie Ihren SAX-Parser so geschrieben haben, dass er jeden xml-Knoten berücksichtigt (und somit das Original wiederherstellen könnte), wäre es nicht schneller als DOM, oder?

Der Grund, den ich frage, ist, dass ich XML-Dokumente schneller zu analysieren versuche. Ich brauche Zugriff auf den gesamten XML-Baum NACH dem Parsen. Ich schreibe eine Plattform für die Integration von Drittanbieter-Diensten, damit ich nicht vorhersehen kann, welche Teile des XML-Dokuments benötigt werden und welche nicht. Ich kenne nicht einmal die Struktur des eingehenden Dokuments. Deshalb kann ich Jaxb oder Sax nicht benutzen. Der Speicherbedarf ist für mich kein Problem, da die XML-Dokumente klein sind und ich immer nur 1 im Speicher benötige. Es ist die Zeit, die es dauert, dieses relativ kleine XML-Dokument zu analysieren, das mich umbringt. Ich habe noch nie Stax benutzt, aber vielleicht muss ich weiter nachforschen, weil es der Mittelweg sein könnte? Wenn ich richtig verstehe, behält Stax die ursprüngliche XML-Struktur bei und verarbeitet die Teile, die ich bei Bedarf anfordere? Auf diese Weise könnte die ursprüngliche Parserzeit schnell sein, aber jedes Mal, wenn ich sie auffordere, einen Teil des Baums zu durchlaufen, den sie noch nicht durchlaufen hat, findet die Verarbeitung statt?

Wenn Sie einen Link angeben, der die meisten Fragen beantwortet, werde ich Ihre Antwort akzeptieren (Sie müssen meine Fragen nicht direkt beantworten, wenn sie bereits an anderer Stelle beantwortet wurden).

update: Ich schrieb es in Sax und es analysiert Dokumente auf AVG 2.1 ms. Dies ist eine Verbesserung (16% schneller) über die 2,5 ms, dass dom fand, aber es ist nicht die Größe, die ich (et al) erraten haben

Dank würden Sie

+0

Ich würde sagen, die Frage, welche schneller ist, ist irrelevant für Ihre Zwecke, weil Sie willkürliche Abfragen gegen den Baum machen müssen. Das bedeutet, dass Sie eine Darstellung der Struktur erstellen müssen und eine Möglichkeit haben, Abfragen dafür zu erstellen. Entweder verwenden Sie DOM/XPath oder Sie schreiben Ihre eigenen Entsprechungen. – Anon

+0

Ich vermute jedoch, dass Ihr echtes Problem nicht SAX vs DOM per se ist, sondern wie Ihr System konfiguriert ist und/oder wie Sie auf die Daten zugreifen. Es sollte nicht so lange dauern, ein "kleines" Dokument mit DOM (oder einem der DOM-Äquivalente) zu analysieren. Haben Sie den Unterschied (den Sie sehen) zwischen SAX und DOM quantifiziert? – Anon

+0

Ich habe den DOM-Ansatz quantifiziert. kleine (ca. 300k) XML-Dokumente. Die aktuelle Implementierung verwendet xerces-j und benötigt ca. 2,5 ms pro xml-Dokument auf einem 1,5-GHz-Rechner. zu quantifizieren Sax ist etwas abhängig davon, wie viel von dem xml Sie behalten und was Sie damit tun. Du hast recht - ich glaube nicht, dass Sax für mich funktionieren wird - die Frage war eher aus Neugierde. – andersonbd1

Antwort

14

Sie nichts tun, Unter der Annahme, aber das Dokument analysieren, die Rangfolge der verschiedenen Parser-Standards ist wie folgt:

1. StAX ist die schnellste

  • Die Veranstaltung Ihnen gemeldet wird

2. SAX ist neben

  • Es tut alles StAX tut und der Inhalt automatisch realisiert wird (Elementname, Namespace, Attribute, ...)

3. DOM ist letzte

  • Es ist SAX alles tut und präsentiert die Information als eine Instanz von Node.

Ihre Use Case

  • Wenn Sie alle XML zu erhalten, ist DOM die Standarddarstellung. Es integriert sauber mit XSLT-Transformationen (javax.xml.transform), XPath (javax.xml.xpath) und Schema-Validierung (javax.xml.validation) APIs. Wenn die Leistung jedoch der Schlüssel ist, können Sie möglicherweise mit StAX schneller eine eigene Baumstruktur erstellen, als ein DOM-Parser ein DOM erstellen könnte.
+0

Ähm, was denkst du passiert, wenn "das Ereignis dir gemeldet wird" versus "der Inhalt wird automatisch realisiert"? – Anon

+4

StAX meldet, dass das Element gestartet wurde. Wenn Sie nie nach dem Elementnamen oder der URI fragen, müssen diese Daten nicht als String-Objekte realisiert werden. Auf der anderen Seite wird ein SAX-Parser erkennen, dass Daten als String-Objekte Teil des Ereignisses sind. –

+0

Vielleicht. Und wenn Sie mir sagen, dass Sie sich die Interna von StaX angeschaut haben und es sich um eine zeichenbasierte Zustandsmaschine handelt, werde ich Ihnen glauben. Ich würde jedoch erwarten, dass Token intern generiert werden, selbst wenn Sie nie danach fragen. – Anon

10

DOM-Parsing erfordert laden das gesamte Dokument in den Speicher und durchqueren Sie dann einen Baum, um die gewünschten Informationen zu finden.

SAX benötigt nur so viel Arbeitsspeicher, wie für die grundlegende E/A benötigt wird, und Sie können die Informationen extrahieren, die Sie benötigen, während das Dokument gelesen wird. Da SAX Stream-orientiert ist, können Sie sogar eine Datei verarbeiten, die noch von einem anderen Prozess geschrieben wird.

+0

Ja, das verstehe ich. Meine Frage war: "Warum parst Sax Saxophon schneller?" nicht "was ist der unterschied zwischen sax und dom?" – andersonbd1

+0

@ Stargazer712 - mikerobi's Antwort hat meine Frage nicht angesprochen. Ich bezweifle, dass er/sie überhaupt die Frage gelesen hat. Es ist eine rote Antwort auf jede dom/sax Frage. Ich bin unvoreingenommen, wenn jemand die Zeit dafür geben würde, eine nachdenkliche Antwort zu geben. – andersonbd1

+2

@ andersonbd1, ich bereite deine Frage vor, es tut mir leid, dass du meine Antwort nicht verstanden hast. Für mich ist es ziemlich offensichtlich, dass ein Prozess, der mehr Speicher benötigt und Ihnen keinen Zugriff auf die Daten gibt, bis er vollständig geparst ist, langsamer ist als ein Prozess, der nur sehr wenig Arbeitsspeicher benötigt und fast genauso schnell auf Daten zugreifen kann kann gelesen werden. – mikerobi

10

SAX ist schneller, da DOM-Parser häufig einen SAX-Parser verwenden, um ein Dokument intern zu analysieren, dann die zusätzliche Arbeit des Erstellens und Manipulierens von Objekten, um jeden Knoten darzustellen, selbst wenn die Anwendung sich nicht um sie kümmert.

Eine Anwendung, die SAX direkt verwendet, wird die Informationen wahrscheinlich effizienter verwenden als ein DOM- "Parser".

StAX ist ein fröhliches Medium, bei dem eine Anwendung eine komfortablere API als SAXs ereignisgesteuerter Ansatz erhält, ohne jedoch die Ineffizienz beim Erstellen eines vollständigen DOM zu erleiden.

1

SAX ist schneller als DOM (normalerweise beim Lesen großer XML-Dokumente), weil SAX Ihnen Informationen als Folge von Ereignissen (normalerweise über einen Handler) zur Verfügung stellt, während DOM Knoten erstellt und die Knotenerstellungsstruktur verwaltet, bis ein DOM-Baum vorhanden ist vollständig erstellt (wie im XML-Dokument dargestellt).

Bei relativ kleinen Dateien werden Sie den Effekt nicht spüren (außer dass die zusätzliche Verarbeitung möglicherweise von DOM ausgeführt wird, um Knotenelement- und/oder Knotenlisten zu erstellen).

Ich kann StAX nicht wirklich kommentieren, da ich noch nie damit gespielt habe.