Was sind schnelle XML-Parser für Ruby?
Ich bin mit Nokogiri, das funktioniert bei kleinen Dokumenten gut. Aber für ein 180KB HTML-Datei habe ich zur Erhöhung der Prozess-stack-Größe, über ulimit -s
, und das parsing und XPath-Abfragen dauern eine lange Zeit.
Gibt es schnellere Methoden zur Verfügung, mit einem Standard-Ruby-distribution?
Ich bin immer verwendet, um den XPath -, aber die Lösung muss nicht unbedingt zur Unterstützung von XPath.
Die Kriterien sind:
- Schnell zu schreiben.
- Schnelle Ausführung.
- Robuste resultierende parser.
- nokogiri ist der Schnellste gem jetzt
- Ich fand ox besser als nokogiri
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nokogiri ist, basierend auf libxml2, das ist eine der schnellsten XML/HTML-Parser in jeder Sprache. Es ist in C geschrieben, aber es gibt Bindungen, in vielen Sprachen.
Das problem ist, dass je komplexer die Datei, desto länger dauert der Bau einer DOM-Struktur im Speicher. Erstellen eines DOM langsamer ist und mehr Speicher-hungrig ist als die anderen Analysemethoden (in der Regel der gesamte DOM muss passen in den Speicher). XPath basiert auf dem DOM.
SAX ist oft das, was den Menschen wiederum für speed oder für große Dokumente, die nicht passen in den Speicher. Es ist mehr event-driven: es benachrichtigt Sie, ein startElement, Endelement, etc, und Sie schreiben Handler auf Sie zu reagieren. Es ist ein bisschen wie ein Schmerz, weil Sie am Ende verfolgen der Staat selbst (z.B. die Elemente, die Sie sind "innen").
Gibt es einen Mittelweg: einige Parser haben einen "pull-parsing" - Funktion, wo Sie eine cursor-ähnliche navigation. Sie besuchen weiterhin jedem Knoten nacheinander, aber Sie können die "fast-forward", um das Ende eines Elements, die Sie nicht interessieren. Es hat die Geschwindigkeit von SAX aber eine bessere Schnittstelle für viele Anwendungen. Ich weiß nicht, ob Nokogiri können dies tun, für HTML, aber ich würde schauen in seine Reader API wenn Sie interessiert sind.
Beachten Sie, dass Nokogiri ist auch sehr nachsichtig mit fehlerhaftem markup (wie z.B. real-world-HTML), und dies allein macht es eine sehr gute Wahl für das HTML-parsing.
Check-out der Ochse gem. Es ist schneller als LibXML und Nokogiri und unterstützt in-memory-Analyse sowie SAX-callback-Analyse. Vollständige Offenlegung, ich schrieb es.
In der performance-Vergleich http://www.ohler.com/software/thoughts/Blog/Entries/2011/9/21_XML_with_Ruby.html beide einen DOM (im Speicher) und SAX (callback) - Parsern verglichen.
Link zu Ox http://rubygems.org/gems/ox. Eine Diskussion der Leistung Unterschiede: http://www.ohler.com/software/thoughts/Blog/Entries/2011/9/21_XML_with_Ruby.html
Können Sie feststellen, dass für größere XML-Dokumente DOM-parsing ist nicht sehr performant. Dies ist, weil der parser bauen muß, ist eine in-memory-Karte der Struktur des XML-Dokuments.
Anderen Ansatz, erfordert im Allgemeinen einen kleineren Speicher-footprint zu verwenden, die eine ereignisgesteuerte SAX-parser.
Nokogiri hat volle Unterstützung für SAX.
Je nach Umgebung, Oga möglicherweise besser geeignet als ein schnell genug XML-Parser für Ruby, mit eine viel bessere Schnittstelle und schneller installation.