我正在尝试解析大型XML文件(> 3GB),如下所示:
context = lxml.etree.iterparse(path)
for action,el in self.context:
# do sth. with el
使用iterparse我认为数据没有完全加载到RAM中,但根据这篇文章我错了:
http://www.ibm.com/developerworks/xml/library/x-hiperfparse/(参见清单4)
虽然当我将此解决方案应用于我的代码时,显然已清除了一些尚未解析的元素(尤其是el
的子元素)。
这个内存问题还有其他解决办法吗?
提前致谢!
答案 0 :(得分:2)
不要忘记使用clear()
,也可以选择清除根元素,如here所述。但据我所知,你已经这样做了,但显然你正在尝试访问已经清除过的内容,或者尚未解析的内容。如果你能提供的东西比“做某事”更有用,那将会很有帮助。您使用的是getnext()
还是getprevious()
? Xpath表达式?
另一个选择,如果你真的不想构建一个树,就是使用target parser interface,就像SAX for lxml / etree(但更容易)。
答案 1 :(得分:1)
我通过直接使用上下文选择标记解决了这个问题:
lxml.etree.iterparse(path, tag=tag)
而不是额外的if子句。
非常感谢您的支持!