使用 python cElementTree 快速检查大型 XML 中标签的存在
fast checking the existence of tag in large XML using python cElementTree
我有XML个几百兆到几十G的文件,用Python's
cElementTree
来处理。由于内存有限,速度慢,我不想将所有内容都加载到内存中,使用 et.parse
然后 find
或 findall
方法来查找标签是否存在(我没有尝试这样,实际上)。现在我简单地使用 et.iterparse
遍历所有标签来达到这个目的。如果标签位于文件末尾附近,这也可能非常慢。我想知道是否有更好的方法来实现这一点并获取标签的位置?如果我知道标签所在的顶层(例如,索引),其大小比文件的其他部分小得多,是否可以遍历顶层标签然后定位该部分进行解析?在网上搜索了一下,居然没有相关问题的贴子。我想念什么吗?提前致谢。
我通过逐块读取文件而不是使用 cElementTree
解析文件来解决这个问题。我的标签接近文件末尾,所以根据 this answer,我使用 file.seek
从文件末尾一次读取指定大小 block_size
的上下文块和 file.read
方法,以及 line = f.read(block_size)
,然后简单地使用 "<my_tag " in line
(或更具体的标签名称以避免歧义)来检查标签是否存在。这比使用 iterparse
遍历所有标签要快得多。
我有XML个几百兆到几十G的文件,用Python's
cElementTree
来处理。由于内存有限,速度慢,我不想将所有内容都加载到内存中,使用 et.parse
然后 find
或 findall
方法来查找标签是否存在(我没有尝试这样,实际上)。现在我简单地使用 et.iterparse
遍历所有标签来达到这个目的。如果标签位于文件末尾附近,这也可能非常慢。我想知道是否有更好的方法来实现这一点并获取标签的位置?如果我知道标签所在的顶层(例如,索引),其大小比文件的其他部分小得多,是否可以遍历顶层标签然后定位该部分进行解析?在网上搜索了一下,居然没有相关问题的贴子。我想念什么吗?提前致谢。
我通过逐块读取文件而不是使用 cElementTree
解析文件来解决这个问题。我的标签接近文件末尾,所以根据 this answer,我使用 file.seek
从文件末尾一次读取指定大小 block_size
的上下文块和 file.read
方法,以及 line = f.read(block_size)
,然后简单地使用 "<my_tag " in line
(或更具体的标签名称以避免歧义)来检查标签是否存在。这比使用 iterparse
遍历所有标签要快得多。