从python中的大量xml文件中提取信息的最有效方法是什么?

时间:2008-12-05 17:15:37

标签: python xml performance large-files expat-parser

我有一个目录已满(~10 3 ,10 4 )的XML文件,我需要从中提取几个字段的内容。 我已经测试了不同的xml解析器,因为我不需要验证内容(昂贵)我只想使用xml.parsers.expat(最快的一个)遍历文件,逐个提取数据。

  1. 有更有效的方法吗? (简单文本匹配不起作用)
  2. 我是否需要为每个新文件(或字符串)发布新的ParserCreate(),还是可以为每个文件重复使用相同的文件?
  3. 有任何警告吗?
  4. 谢谢!

4 个答案:

答案 0 :(得分:4)

通常情况下,我会建议使用ElementTree的iterparse,或者使用lxml来提高速度。还尝试使用Processing(内置2.6)进行并行化。

关于iterparse的重要一点是,在解析元素(子)结构时,你会得到它们。

import xml.etree.cElementTree as ET
xml_it = ET.iterparse("some.xml")
event, elem = xml_it.next()
在这种情况下,

event将永远是字符串"end",但您也可以初始化解析器,以便在解析新元素时告诉您。你不能保证在那一点上所有的子元素都会被解析,但如果你只对它感兴趣那么属性就在那里。

另一点是你可以提前停止从迭代器中读取元素,即在整个文档处理之前。

如果文件很大(是吗?),就像在流解析器中一样,有一个常用的习惯用法可以保持内存使用不变。

答案 1 :(得分:3)

最快的方法是匹配字符串(例如,使用正则表达式)而不是解析XML - 这取决于您实际可以工作的XML。

但最重要的是:不要考虑几个选项,只需实施它们并在一小部分上计时。这将花费大致相同的时间,并且会给你真实的数字,这会让你前进。

编辑:

  • 本地驱动器或网络驱动器上的文件是?网络I / O会在这里杀了你。
  • 问题并行化 - 您可以在多台计算机(或多核计算机上的多个进程)之间拆分工作。

答案 2 :(得分:1)

如果您知道XML文件是使用相同的算法生成的,那么根本不进行任何XML解析可能更有效。例如。如果你知道数据在第3,4和5行,你可以逐行读取文件,然后使用正则表达式。

当然,如果文件不是机器生成的,或者源自不同的生成器,或者生成器随时间变化,那么该方法将失败。但是,我乐观地认为更有效率。

您是否回收解析器对象在很大程度上是无关紧要的。将创建更多的对象,因此单个解析器对象实际上并不重要。

答案 3 :(得分:1)

您没有说明的一件事是您是否正在将XML读入某种类型的DOM中。我猜你可能不是,但是你有机会,不要。请改用xml.sax。使用SAX而不是DOM将为您带来显着的性能提升。