2016-04-28 14 views
1

Ich benutze Scrapy XMLFeedSpider, um einen großen XML-Feed (60 MB) von einer Website zu analysieren, und ich habe mich nur gefragt, ob es nur einen Teil davon gibt 60MB, weil im Moment der RAM verbraucht ist ziemlich hoch, vielleicht etwas in den Link wie setzen:Nur einen Teil eines XML-Feeds abrufen

"http://site/feed.xml?limit=10", ich habe gesucht, wenn es etwas ähnliches, aber ich habe nichts gefunden. Eine andere Option wäre die Anzahl der von scrapy geparsten Elemente zu begrenzen, aber ich weiß nicht, wie das geht. Sobald der XMLFeedSpider das ganze Dokument analysiert hat, wird der Bot nur die ersten zehn Elemente analysieren, aber ich nehme an, dass der Ganzer Feed wird immer noch im Speicher sein. Haben Sie eine Idee, wie Sie die Leistung des Bot verbessern können, indem Sie den RAM- und CPU-Verbrauch verringern?

Dank
+0

http://doc.scrapy.org/en/master/topics/spiders.html#scrapy.spiders.XMLFeedSpider.iterator Siehe diesen Teil der Dokumentation. Es beschreibt das Heilmittel. –

Antwort

1

Wenn Sie große XML-Dokumente verarbeiten und nicht möchten, dass die gesamte Sache im Speicher wie DOM-Parser geladen wird. Sie müssen zu einem SAX parser wechseln.

SAX-Parser haben einige Vorteile gegenüber DOM-artigen Parsern. Ein SAX-Parser muss nur jedes Parsereignis melden, wie es geschieht, und normalerweise verwirft fast alle diese Informationen einmal gemeldet (es tut jedoch halten einige Dinge, zum Beispiel eine Liste aller Elemente, die wurden nicht geschlossen noch, um spätere Fehler wie End-Tags in der falschen Reihenfolge zu fangen). Daher ist der für einen SAX-Parser erforderliche Mindestspeicher proportional zur maximalen Tiefe der XML-Datei (dh der XML-Struktur) und der maximalen Datenmenge eines einzelnen XML-Ereignisses (z. B. Name und Attribute von a einzelner Start-Tag oder der Inhalt einer Verarbeitungsanweisung usw.).

Für ein XML-Dokument mit 60 MB ist dies wahrscheinlich sehr niedrig im Vergleich zu den Anforderungen für die Erstellung eines DOM. Die meisten DOM-basierten Systeme verwenden tatsächlich auf einer viel niedrigeren Ebene, um den Baum aufzubauen.

Um nutzen sax, Unterklasse xml.sax.saxutils.XMLGenerator und Übergehungseinrichtung endElement, startElement und characters zu erstellen. Rufen Sie dann xml.sax.parse damit an. Es tut mir leid, dass ich kein detailliertes Beispiel zur Hand habe, um es mit Ihnen zu teilen, aber ich bin sicher, Sie werden viel online finden.

+0

Danke! Ich werde darin tauchen! Das habe ich gebraucht. – 0cN

1

Sie sollten den Iterator-Modus Ihres XMLFeedSpider zu iternodes gesetzt (siehe here):

Es wird empfohlen, das iternodes Iterator aus Performance-Gründen so

Nachdem ich zu verwenden, sollten Sie sein kann über Ihren Feed iterieren und an jedem Punkt anhalten.

+0

Ich benutze es bereits, aber parse_nodes analysiert jedes Element, sodass der gesamte 60MB-Feed geparst wird. Gibt es eine Möglichkeit zu entscheiden, wie viele Knoten zu lesen sind? – 0cN

Verwandte Themen