2016-04-28 4 views
1

私はScrapy XMLFeedSpiderを使用してウェブサイトから大きなXMLフィード(60MB)を解析していますが、全部ではなくその一部だけを取得する方法があるかどうかは疑問でした現在はRAMがかなり高くなっているので、おそらく何かがリンクに入れられるようです:XMLフィードの一部のみを取得する

"http://site/feed.xml?limit=10"、これと類似しているものは検索しましたが、何も見つかりませんでした。

もう一つの選択肢は、scrapyによって解析される項目を制限することですが、私はそれを行う方法がわかりません。一度XMLFeedSpiderが文書全体を解析すると、ボットは最初の10項目だけを分析します。全体のフィードはまだメモリ内にあります。 ボットのパフォーマンスを向上させ、RAMとCPU消費を減らす方法についてお考えですか?おかげ

+0

http://doc.scrapy.org/ja/master/topics/spiders.html#scrapy.spiders.XMLFeedSpider.iteratorドキュメントのこの部分を参照してください。それは救済策を記述する。 –

答えて

1

大規模なxmlドキュメントを処理しているときに、DOMパーサが行うようにメモリ全体をロードしたくない場合。 SAX parserに切り替える必要があります。

DOMスタイルのパーサーに比べてSAXパーサーにはいくつかの利点があります。 SAXパーサー は、各パースイベントが発生した場合にのみレポートする必要があります。通常、 は、一度報告された情報のほとんどを破棄します( ただし、いくつかのものを保持します。たとえば、 が閉じられていないすべての要素のリストさらに、 終了タグのような後のエラーを間違った順序で捕捉するために)。したがって、SAXパーサー に必要な最小メモリは、XMLファイルの最大の深さ(つまり、XMLツリーの )と1つのXMLイベントに含まれる最大データに比例します。シングルスタートタグ、または処理命令の内容 など)。

60 MBのXMLドキュメントでは、これはDOMを作成するための要件と比較して非常に低い可能性があります。ほとんどのDOMベースのシステムは実際にはかなり低いレベルでツリーを構築します。サックス、サブクラスxml.sax.saxutils.XMLGeneratorのメーク利用を作成するために

とoverrider endElementstartElementcharacters。その後、xml.sax.parseと呼んでください。申し訳ありませんが、あなたと共有するための詳細な例はありませんが、十分にオンラインで見つけることができます。

+0

ありがとう!私はそれに潜入する!それが私の必要なものです。 – 0cN

1

あなたはiternodesにごXMLFeedSpiderのイテレータモードを設定する必要があります(hereを参照してください):それはそうした後、パフォーマンス上の理由

ためiternodesイテレータを使用することをお勧めします

、あなたがしなければなりませんあなたのフィードを繰り返し処理し、いつでも停止することができます。

+0

私はすでにそれを使用していますが、parse_nodesは各項目を解析するので、60MBフィード全体が解析されます。読み込むノード数を決定する方法はありますか? – 0cN

関連する問題