我有一个未压缩的Wikipedia转储文件,大约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文件。
发布于 2020-02-11 04:23:04
但是要这样做,我必须先把它读进去,对吧?
?
实际上,no.
一般来说,有两种方法来处理XML数据。一种方法是“全部读入内存”,一次创建一个内存中的数据结构。但是另一种方法通常称为SAX,它读取XML文件并在指定的位置调用代码中的“处理程序”。该文件可以任意大小。
还有另一种称为"XPath表达式“的技术。这使您可以构造一个字符串,该字符串告诉XPath引擎要查找哪些节点。然后,XPath将向您返回相应节点的列表。You ‘t to "write a program"(!)来获得你需要的结果,只要XPath能帮你完成这项工作。(我推荐使用libxml2,它是一个行业标准的二进制引擎,用于完成这类工作。参见How to use Xpath in Python?)
https://stackoverflow.com/questions/60157653
复制相似问题