我正在使用Scrapy XMLFeedSpider从网站解析一个大的XML源(60MB),我只是想知道是否有办法只检索它的一部分而不是全部60MB,因为现在消耗的RAM是非常高,也许可以放在链接中:
“http://site/feed.xml?limit=10”,我搜索过是否有类似的东西,但我没有找到任何东西。
另一种选择是限制scrapy解析的项目,但我不知道如何做到这一点。现在,一旦XMLFeedSpider解析整个文档,机器人将仅分析前十项,但我认为整个饲料仍然在记忆中。 您是否知道如何提高机器人的性能,减少RAM和CPU消耗?感谢
答案 0 :(得分:1)
答案 1 :(得分:1)
当您处理大型xml文档时,您不希望像DOM解析器那样在内存中加载整个内容。您需要切换到SAX parser。
SAX解析器比DOM样式解析器有一些好处。 SAX解析器 只需要在发生时报告每个解析事件,通常情况下 一旦报告,几乎丢弃所有这些信息(确实如此) 但是,保留一些东西,例如所有元素的列表 尚未关闭,为了赶上以后的错误,如 结束标签的顺序错误)。因此,a所需的最小内存 SAX解析器与XML文件的最大深度成比例(即, (例如,XML树)以及单个XML事件中涉及的最大数据 (例如单个开始标记的名称和属性,或内容 处理指令等。)。
对于60 MB的XML文档,与创建DOM的要求相比,这可能非常低。大多数基于DOM的系统实际上使用更低的级别来构建树。
为了创建使用sax,子类xml.sax.saxutils.XMLGenerator
和覆盖endElement
,startElement
和characters
。然后用它来调用xml.sax.parse
。对不起,我手边没有详细的例子与您分享,但我相信您会在网上找到很多。