python - Python - 过滤超大 XML 文件
问题描述
我有一个未压缩的维基百科转储约为 75 GB(压缩:~16 GB)。我尝试过使用类似的东西
from xml.etree.ElementTree import iterparse
for event, elem in iterparse('enwiki-latest-pages-articles-multistream.xml'):
if elem.tag == "___":
#do something
elem.clear()
一段时间后,内核最终在 Jupyter Notebook 中死亡。问题是我不想要这个转储中的所有数据(大约 1000M 行)——我只想为几个实体过滤它。但要做到这一点,我必须先阅读它,对吧?这似乎是导致内核死亡的原因。我只想要它的一个非常小的子集,并想看看是否有办法在 Jupyter 中完成这种过滤,例如大型 XML 文件。
解决方案
但要做到这一点,我必须先阅读它,对吧?
实际上,没有。
一般来说,有两种处理 XML 数据的方法。一种方法确实“将其全部读入内存”,一次创建一个内存数据结构。但是另一种方法,通常称为 SAX,读取 XML 文件并在代码中的指定点调用“处理程序”。文件可以任意大。
还有另一种称为“XPath 表达式”的技术。这使您可以构造一个字符串,告诉 XPath 引擎您要查找哪些节点。然后 XPath 会返回一个对应节点的列表给您。 您不必“编写程序”(!)来获得所需的结果,只要 XPath 可以为您完成工作。(我推荐使用libxml2
,这是一个行业标准的二进制引擎来做这种事情。请参阅如何在 Python 中使用 Xpath?)
推荐阅读
- spring-boot - 有没有办法使用一种发布方法Spring Boot发布多个请求
- javascript - Cytoscape:在“渲染”事件回调中添加的元素未在图中显示
- php - 使用 Twinfield Openid Oauth 连接时的“Invalid_grant”响应
- python - 在 plot python 中编写回归方程
- python - pytest-mock - 从模块中模拟一个函数
- angular - “ObjectUnsubscribedError”- 在使用 get 调用重新加载角度数据表时
- angular - 在 Angular 中更改极地数据集的颜色
- php - 如何将函数变量与另一个函数一起使用
- ruby-on-rails - 当我在 Heroku 上部署我的应用程序时出现问题
- php - 即使在使用 laravel 5.6 以未经身份验证的方法更改默认路由后,路由未定义错误