2010-10-27 20 views
6

Sto usando Nokogiri che funziona bene per i piccoli documenti. Ma per un file HTML 180KB devo aumentare le dimensioni dello stack del processo, tramite ulimit -s, e le query di analisi e XPath richiedono molto tempo.Cosa sono i parser XML veloci per Ruby?

Sono disponibili metodi più veloci utilizzando una distribuzione Ruby di serie?

mi sto abituando a XPath, ma la soluzione non ha necessariamente bisogno di sostenere XPath.

I criteri sono:

  1. veloce da scrivere.
  2. Esecuzione veloce.
  3. Robusto parser risultante.
+0

nokogiri è la gemma più veloce in questo momento – s84

+0

Ho trovato buoi meglio di nokogiri –

risposta

6

Nokogiri si basa su libxml2, che è uno dei più veloci parser XML/HTML in qualsiasi lingua. È scritto in C, ma ci sono collegamenti in molte lingue.

Il problema è che il più complesso il file, più tempo ci vuole per costruire una struttura completa del DOM in memoria. La creazione di un DOM è più lenta e più ricca di memoria rispetto ad altri metodi di analisi (generalmente l'intero DOM deve adattarsi alla memoria). XPath si affida a questo DOM.

SAX è spesso ciò che le persone si rivolgono a per la velocità o per documenti di grandi dimensioni che non rientrano nella memoria. È più guidato dagli eventi: ti informa di un elemento di avvio, di un elemento finale, ecc. E scrivi ai gestori di reagire a loro. È un po 'un dolore perché finisci per tenere traccia dello stato te stesso (ad esempio quali elementi sei "dentro").

C'è una via di mezzo: alcuni parser avere una capacità di "tirare parsing" in cui si dispone di un cursore di navigazione simile. Continui a visitare ogni nodo in modo sequenziale, ma puoi "avanzare velocemente" alla fine di un elemento che non ti interessa. Ha la velocità di SAX ma un'interfaccia migliore per molti usi. Non so se Nokogiri può fare questo per HTML, ma guarderei nel suo Reader API se sei interessato.

Si noti che Nokogiri è anche molto indulgente con il markup malformato (come HTML del mondo reale) e questo da solo lo rende un'ottima scelta per l'analisi HTML.

+0

nokogiri non è troppo veloce come previsto. in questo momento ho un problema con l'analisi di file XML di grandi dimensioni. Non so davvero quanti record ci siano nel file, ma la dimensione del file è 7.2mb. così quando provo ad analizzare - nokogiri riaggancia. e raggiunge la perdita di memoria – ajahongir

+0

Sarei interessato a questa capacità. _ "avanti veloce" fino alla fine di un elemento a cui non sei interessato_ Nokogiri SAX ha questo? –

+0

@HarryWood SAX come API è una semplice vaniglia. Tuttavia, controlla la gemma [saxerator] (https://github.com/soulcutter/saxerator) che usa SAX sotto il cofano e in sostanza procederà velocemente a un elemento che stai cercando e enumererà gli elementi lì. –

0

È possibile che per documenti XML di dimensioni maggiori il parsing di DOM non sia molto performante. Questo perché il parser deve costruire una mappa in memoria della struttura del documento XML.

L'altro approccio che richiede generalmente un minor richiesta di memoria è di usare un parser SAX event-driven.

Nokogiri ha pieno supporto per SAX.

15

Scopri la gemma di bue. È più veloce di LibXML e Nokogiri e supporta l'analisi della memoria e l'analisi di callback SAX. Full disclosure, l'ho scritto.


Nel confronto prestazioni http://www.ohler.com/software/thoughts/Blog/Entries/2011/9/21_XML_with_Ruby.html sia un DOM (in memoria) e SAX (callback) parser vengono confrontati.

+0

Hm, vuoi aggiungere un collegamento ad esso? – maxschlepzig

+1

Ho usato Ox e ne sono stato molto contento (https://github.com/ohler55/ox) –

+0

Dove posso trovare ulteriore documentazione sull'utilizzo di nodi simili, cdata in ox gem? –

0

seconda dell'ambiente, Oga può essere più adatto come abbastanza veloceparser XML per Ruby con un'interfaccia molto meglio e il tempo di installazione più veloce.