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

2023-12-06

我正在使用 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 似乎与同时使用 A 相同。

第二 - 为什么这仍然消耗这么多内存?程序运行时,接近尾声时会使用大约 100 MB 的 RAM。

我认为这与 outf 有关,但为什么呢?不就是写入磁盘吗?如果它在 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/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 elementtree.ElementTree.iterparse 使用这么多内存? 的相关文章

随机推荐

  • 根据 2D 索引替换 2D numpy 数组元素[重复]

    这个问题在这里已经有答案了 这个问题可能以前在某个地方被问过 但经过一番搜索后我找不到任何问题 因此在此发布 假设我有一个数组A和一个索引数组idx 暂时让两个数组都是二维的 import numpy as np A np array 3
  • JComponent大小问题

    我有一个JComponent我用来在屏幕上绘制形状的子类 在构造函数中 我试图设置ballX and ballY到一半X and Y的大小值JComponent 我认为我做错了 我现在查了很多资料 还是找不到解决办法 代码如下 请记住 这是
  • AngularJS - 从视图到控制器的 json 数据

    我从 xsl 翻译器获取 html 模板 json 数据 它是动态的 看起来像 html 代码加上字符串化 json 中的一些数据 问题是 我以什么方式将 json 字符串放入 html 代码中 以便控制器在 html 渲染之前捕获此 js
  • MVVM下WPF DataGridTemplateColumn可见性绑定

    我的 ViewModel 中有一个绑定到 ICollectionView 的 DataGrid DataGrid 位于 UserControl 内 该 UserControl 用于几种不同的数据场景 其中一些需要某些 DataGrid 列
  • 将背景图像居中对齐

    这是 HTML div class gallerybox a href CustomContentRetrieve aspx ID 398791 img alt src Utilities image jpg width 400 heigh
  • Delphi:使用参数时如何获取传递到服务器的查询

    我有一个带有 Devart TMSQuery SQL 内参数的查询 就像是 select from customers where customer CustomerID 在我做的代码中 Delphi sqlcustomer ParamBy
  • MongoDB 中的 geoNear 可以返回文档中字段的子集吗?

    当使用 geoNear 时 它返回所有字段 整个文档 它找到的对象 有什么方法可以将其限制为字段的子集吗 目前不支持这一点 唯一的解决方法是使用 near 并自己进行距离计算 dist sqrt dx dx dy dy
  • 如何查找 SQL Server 中所有数据库中所有表的列名

    我想找到所有表中的所有列名在所有数据库中 有没有一个查询可以为我做到这一点 尝试这个 select o name c name from sys columns c inner join sys objects o on c object
  • Microsoft Graph - 允许用户访问应用程序/服务主体

    我们正在向员工推出一个主要应用程序 它已设置为使用 Azure AD SSO 目前我们必须通过 Azure AD gt 应用程序 gt 用户手动设置每个用户才能访问该应用程序 我们有一个小型 C Web 应用程序 用于管理 AD 用户希望使
  • 使用 PushState 为 Backbone SPA 配置 Node Express

    我的 Express 应用程序有一个休息服务器和一个使用 Backbone 的 SPA 使用 history一切正常 即 Backbone history start If I do Backbone history start pushS
  • 使用 C# 写入 Excel

    我有一个基本的 WinForms 应用程序 并且希望能够将该应用程序中的数据写入 Excel 电子表格 到目前为止我有以下代码 Microsoft Office Interop Excel Application excelapp new
  • 自定义上传按钮

    嗨 我只是想知道如何创建自己的自定义文件上传按钮 因为我能做的最好的就是 我想要实现的是 如果有的话我会非常感激 请我提供解释如何使用代码执行此操作的答案 而不是包含允许您下载按钮或类似内容的网站链接的答案 谢谢 尽管其中一些答案会创建一些
  • 历史数据的非抽样报告自动化

    我们有一个客户每天收到 2 400 万次访问 因此我们只能获得未抽样的报告 因为它超出了谷歌的限制 对于尚未存储数据的特殊查询 最多 500 000 个会话 我们正在尝试收集 1 天期间的独立访客和访问次数 事实证明 当数据被采样时 使用
  • 给定 k 个已排序数组,从每个数组中选择一个元素,使得所选元素的最大元素和最小元素之差最小

    给定 k 个已排序数组 从每个数组中选择一个元素 使得所选元素的最大元素和最小元素之差最小 k 3 的示例 数组1 1 13 27 30 数组2 16 20 29 数组3 2 3 14 18 19 22 25 28 答 2 选定的元素 27
  • 将指针/引用作为参数传递给变量

    我知道这个问题已经被问过多次 是的 我做了一些研究 但我找不到适合我需求的解决方案 到目前为止我所做的 我正在构建一个函数 用于跟踪用户向下滚动页面的百分比并将其很好地显示在某个进度条中 这工作得很好 但是当我在 Chrome 上打开开发者
  • 如何让 OpenMP 在 MSVC 2015 上运行 clang

    我尝试让 clang 5 0 0 适用于 Visual Studio 2015 因为我需要 OpenMP 3 0 功能 我安装了clang编译器 不是没有任何openmp支持的vs2015版本 并使用cmake cmake minimum
  • 通过 javascript 更改页面比例

    我希望根据分辨率缩放网站主体 但代码似乎不起作用 document body style transform scale window screen availHeight 2 document body style o transform
  • 对动态表行进行编号

    我正在使用 jQuery 制作动态 HTML 表格 在表中 我的用户有两种交互 追加一行 删除特定行 对行进行编号的问题是 如果用户删除特定行 则该行后面的所有行都需要重新编号 我必须选择已删除行之后的所有行并将其行数减去 1 有更好的方法
  • 如何在 SQL Server 上启用 MSDTC?

    这甚至是一个有效的问题吗 我有一个使用 MSTDC 的 NET Windows 应用程序 它抛出异常 System Transactions TransactionManagerCommunicationException 分布式事务管理器
  • 为什么 elementtree.ElementTree.iterparse 使用这么多内存?

    我正在使用 elementtree ElementTree iterparse 来解析一个大的 371 MB xml 文件 我的代码基本上是这样的 outf open out txt w context iterparse copyrigh