系统相关
首页 > 系统相关> > python-为什么elementtree.ElementTree.iterparse使用这么多内存?

python-为什么elementtree.ElementTree.iterparse使用这么多内存?

作者:互联网

我正在使用elementtree.ElementTree.iterparse解析大型(371 MB)xml文件.

我的代码基本上是这样的:

outf = open('out.txt', 'w') 
context = iterparse('copyright.xml')
context = iter(context)
dummy, root = context.next()

for event, elem in context:
    if elem.tag == 'foo':
        author = elem.text

    elif elem.tag == 'bar':
        if elem.text is not None and 'bat' in elem.text.lower():
            outf.write(elem.text + '\n')
    elem.clear()   #line A
    root.clear()   #line B

我的问题有两个:

首先-我是否同时需要A和B(请参阅代码段注释)?有人告诉我root.clear()清除不必要的子项,因此不会占用内存,但这是我的观察结果:就内存消耗而言,使用B而不使用A与不使用两者相同(由任务管理器绘制).仅使用A似乎与同时使用两者相同.

第二-为什么这仍然消耗那么多内存?程序运行时,将在末尾使用大约100 MB的RAM.

我认为这与outf有关,但是为什么呢?它不只是写入磁盘吗?而且,如果它在关闭前存储数据,我该如何避免呢?

其他信息:
我在Windows上使用Python 2.7.3.

解决方法:

(发布的代码缩进第二行,不应运行.)
http://bugs.python.org/issue14762是一个类似的问题,答案是应该清除每个元素(A行).如果不知道什么是outf(或创建它的代码),很难回答第二个问题.如果它是一个StringIO对象,答案将显而易见.您可能会看到跟踪器问题的第二条消息中链接的教程:

http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python-with-elementtree/

标签:python,memory,xml,elementtree,iterparse
来源: https://codeday.me/bug/20191009/1879200.html