在 python 中更改和解析大型 XML 文件的内存高效方法
memory efficient way to change and parse a large XML file in python
我想解析 python 中的一个大 XML 文件 (25 GB),并更改其中的一些元素。
我尝试了 xml.etree 的 ElementTree,但第一步花费了太多时间 (ElementTree.parse)。
我在某处读到 SAX 很快并且不会将整个文件加载到内存中但它只是用于解析而不是修改。
'iterparse' 也应该只用于解析而不是修改。
是否还有其他速度快且内存效率高的选项?
这里对您来说重要的是您需要一个流式解析器,这就是 sax。 (在 python 中有一个内置的 sax 实现,lxml 提供了一个。)问题是,由于您试图修改 xml 文件,您将不得不重写 xml 阅读文件。
一个XML文件是一个文本文件,你不能在不重写整个文本文件的情况下改变文本文件中间的一些数据(除非数据是完全相同的大小不太可能)
你可以使用SAX读入每个元素,并注册一个事件,在每个元素被读取和修改后写回。如果您的更改真的很简单,那么甚至不用理会 XML 解析并只匹配您要查找的内容的文本可能会更快。
如果您正在对这么大的 XML 文件做任何重要的工作,那么我会说您不应该使用 XML 文件,您应该使用数据库。
您在此处遇到的问题 运行 与大型机上的 Cobol 程序员在处理基于文件的数据时遇到的问题相同
我想解析 python 中的一个大 XML 文件 (25 GB),并更改其中的一些元素。
我尝试了 xml.etree 的 ElementTree,但第一步花费了太多时间 (ElementTree.parse)。
我在某处读到 SAX 很快并且不会将整个文件加载到内存中但它只是用于解析而不是修改。
'iterparse' 也应该只用于解析而不是修改。
是否还有其他速度快且内存效率高的选项?
这里对您来说重要的是您需要一个流式解析器,这就是 sax。 (在 python 中有一个内置的 sax 实现,lxml 提供了一个。)问题是,由于您试图修改 xml 文件,您将不得不重写 xml 阅读文件。
一个XML文件是一个文本文件,你不能在不重写整个文本文件的情况下改变文本文件中间的一些数据(除非数据是完全相同的大小不太可能)
你可以使用SAX读入每个元素,并注册一个事件,在每个元素被读取和修改后写回。如果您的更改真的很简单,那么甚至不用理会 XML 解析并只匹配您要查找的内容的文本可能会更快。
如果您正在对这么大的 XML 文件做任何重要的工作,那么我会说您不应该使用 XML 文件,您应该使用数据库。
您在此处遇到的问题 运行 与大型机上的 Cobol 程序员在处理基于文件的数据时遇到的问题相同