我有一个目录已满(~10 3 ,10 4 )的XML文件,我需要从中提取几个字段的内容。 我已经测试了不同的xml解析器,因为我不需要验证内容(昂贵)我只想使用xml.parsers.expat(最快的一个)遍历文件,逐个提取数据。
谢谢!
答案 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。
但最重要的是:不要考虑几个选项,只需实施它们并在一小部分上计时。这将花费大致相同的时间,并且会给你真实的数字,这会让你前进。
编辑:
答案 2 :(得分:1)
如果您知道XML文件是使用相同的算法生成的,那么根本不进行任何XML解析可能更有效。例如。如果你知道数据在第3,4和5行,你可以逐行读取文件,然后使用正则表达式。
当然,如果文件不是机器生成的,或者源自不同的生成器,或者生成器随时间变化,那么该方法将失败。但是,我乐观地认为会更有效率。
您是否回收解析器对象在很大程度上是无关紧要的。将创建更多的对象,因此单个解析器对象实际上并不重要。
答案 3 :(得分:1)
您没有说明的一件事是您是否正在将XML读入某种类型的DOM中。我猜你可能不是,但是你有机会,不要。请改用xml.sax。使用SAX而不是DOM将为您带来显着的性能提升。