当前位置: 首页 > 面试题库 >

为什么lxml.etree.iterparse()占用了我所有的内存?

焦信鸥
2023-03-14
问题内容

这最终会消耗我所有的可用内存,然后进程被杀死。我曾尝试将标签从更改schedule为“较小”标签,但这并没有什么不同。

我在做什么错/如何处理这个大文件iterparse()

import lxml.etree

for schedule in lxml.etree.iterparse('really-big-file.xml', tag='schedule'):
    print "why does this consume all my memory?"

我可以轻松地将其切碎并以较小的块进行处理,但这比我想要的还要难看。


问题答案:

iterparse遍历整个文件时,将构建一棵树,并且不会释放任何元素。这样做的好处是元素可以记住其父元素是谁,并且您可以形成引用祖先元素的XPath。缺点是它会消耗大量内存。

为了在解析时释放一些内存,请使用Liza Daly的fast_iter

def fast_iter(context, func, *args, **kwargs):
    """
    http://lxml.de/parsing.html#modifying-the-tree
    Based on Liza Daly's fast_iter
    http://www.ibm.com/developerworks/xml/library/x-hiperfparse/
    See also http://effbot.org/zone/element-iterparse.htm
    """
    for event, elem in context:
        func(elem, *args, **kwargs)
        # It's safe to call clear() here because no descendants will be
        # accessed
        elem.clear()
        # Also eliminate now-empty references from the root node to elem
        for ancestor in elem.xpath('ancestor-or-self::*'):
            while ancestor.getprevious() is not None:
                del ancestor.getparent()[0]
    del context

然后可以这样使用:

def process_element(elem):
    print "why does this consume all my memory?"
context = lxml.etree.iterparse('really-big-file.xml', tag='schedule', events = ('end', ))
fast_iter(context, process_element)

我强烈推荐上述内容所依据的文章fast_iter;如果您要处理大型XML文件,这对您来说应该特别有趣。

fast_iter上面介绍的文章中所示的一个略加修改的版本。这对于删除以前的祖先更具攻击性,从而节省了更多内存。



 类似资料:
  • 我对编程相对较新,所以如果这个问题很愚蠢,我很抱歉。我正在创建一个Java程序,它在JPanel中包含一个JButton,而JPanel在JFrame中。另一个按钮在JPanel之外,但仍在JFrame中。我将布局设置为BoxLayout。我的问题是,我把面板做成黑色,除了第二个按钮之外,它占据了整个JFrame。如何使JPanel只占用第一个按钮周围的区域?

  • 防锈文件中的封闭部分有这个例子。 文件上说 然而,如果你的关闭需要它,铁锈将占据所有权,并改变环境 上面的代码导致这个错误 医生说 Vec对其内容拥有所有权,因此,当我们在闭包中引用它时,我们必须获得nums的所有权。这就像我们将nums传递给一个拥有它的函数一样。 我不明白为什么闭包不只是借用向量的所有权,就像在本例中从文档中所做的那样 这个闭包,加上_num,指的是其作用域中的let绑定:nu

  • 我在一个Android布局文件中出错(忘记了我维度中的),在重新构建时,Android Studio将我对(由于错误构建,没有生成)的所有引用替换为。这是正常行为吗?如何禁用此功能?这是允许自动进口造成的吗?

  • 我的问题作为标题,通过搜索得到了一些知识: > Linux具有共享内存如何测量应用程序或进程的实际内存使用情况? JVM将保留在Xms中设置的内存量,对于堆内存,-Xms JVM是什么意思? 下面是我在Ubuntu12.04(64bit)JDK 1.7.0_04上的测试运行。和顶部显示如下:

  • 从图片中可以看到,imageView幻灯片上的空间图片几乎占据了整个屏幕,当我想要它的时候: > 从操作栏下方开始(您可以看到自定义应用程序栏的浅紫色) 占据了这下面所有的空间。如果有人有什么想法,我会非常感激的,谢谢。图片:https://imgur.com/a/fpbcyh9 null

  • 问题内容: 我在VM上运行容器。我的容器默认将日志写入/var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID- json.log文件,直到磁盘已满。 当前,我必须手动删除此文件,以避免磁盘已满。我读到在Docker 1.8中会有一个参数来旋转日志。您会建议什么作为当前解决方法? 问题答案: Docker 1.8已发布,带有日志轮换选项。新增: 当容