2016-04-28 68 views
1

我正在使用Scrapy XMLFeedSpider從網站解析一個大的XML源(60MB),我只是想知道是否有辦法檢索它的一部分而不是全部60MB,因爲現在內存消耗非常高,也許有些東西要放在鏈接中,例如:只檢索XML Feed的一部分

http://site/feed.xml?limit=10」,我搜索了是否有類似的東西,但我還沒有找到任何東西。

另一種選擇是限制scrapy解析的項目,但我不知道該怎麼做。現在,一旦XMLFeedSpider解析了整個文檔,bot將只分析前10個項目,但我認爲整個飼料仍將留在記憶中。 關於如何提高機器人的性能,減少RAM和CPU消耗,你有什麼想法嗎?由於

+0

http://doc.scrapy.org/en/master/topics/spiders.html#scrapy.spiders.XMLFeedSpider.iterator請參閱這部分文檔。它描述了補救措施。 –

回答

1

在處理大型xml文檔時,您不想像DOM解析器一樣將整個內容加載到內存中。您需要切換到SAX parser

SAX解析器比DOM式解析器有一些優點。 SAX解析器 僅需要在發生時報告每個解析事件,並且通常 一旦報告就丟棄幾乎所有的信息(但它確實保留了一些內容,例如 尚未關閉的所有元素的列表但爲了趕上後面的錯誤,如 以錯誤的順序結束標籤)。因此,SAX解析器所需的最小內存與XML文件的最大深度(即,XML樹的 )以及單個XML事件 中涉及的最大數據成比例(如名稱和屬性單個開始標籤,或處理指令的內容 等)。

對於60 MB的XML文檔,與創建DOM的要求相比,這可能非常低。大多數基於DOM的系統實際使用的層次非常低,無法構建樹。

爲了創建使用薩克斯,子類xml.sax.saxutils.XMLGenerator和覆蓋endElementstartElementcharacters。然後撥打xml.sax.parse。很抱歉,我沒有詳細的例子與您分享,但我相信您會在網上找到豐富的內容。

+0

謝謝!我會潛入它!這就是我需要的。 – 0cN

1

你應該設置你的XMLFeedSpider的迭代器模式iternodes(見here):

我們推薦使用性能原因iternodes迭代

這樣做之後,你應該能夠迭代您的Feed並在任何時候停止。

+0

我已經在使用它,但parse_nodes會解析每個項目,所以整個60MB訂閱源將被解析。是否有一種方法可以決定要讀取多少個節點? – 0cN