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

在python中,从大量xml文件中提取信息的最有效方法是什么?,python,xml,performance,large-files,expat-parser,Python,Xml,Performance,Large Files,Expat Parser,我有一个满目录(~103104)的XML文件,需要从中提取几个字段的内容。 我已经测试了不同的xml解析器,因为我不需要验证内容(代价高昂),所以我考虑简单地使用xml.parsers.expat(最快的一个)遍历文件,逐个提取数据 有没有更有效的方法?(简单的文本匹配不起作用) 我需要为每个新文件(或字符串)发出新的ParserCreate(),还是可以为每个文件重复使用相同的ParserCreate() 有什么警告吗 谢谢 如果您知道XML文件是使用相同的算法生成的,那么不进行任何XML解析

我有一个满目录(~103104)的XML文件,需要从中提取几个字段的内容。 我已经测试了不同的xml解析器,因为我不需要验证内容(代价高昂),所以我考虑简单地使用xml.parsers.expat(最快的一个)遍历文件,逐个提取数据

  • 有没有更有效的方法?(简单的文本匹配不起作用)
  • 我需要为每个新文件(或字符串)发出新的ParserCreate(),还是可以为每个文件重复使用相同的ParserCreate()
  • 有什么警告吗

  • 谢谢

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

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


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

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

    但最重要的是:与其考虑几个选项,不如实施它们并在一个小集合上计时。这将需要大致相同的时间,并会给你真实的数字,并推动你前进

    编辑:

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

      • 有一件事您没有指出,那就是您是否正在将XML读入某种DOM中。我猜你可能不是,但很可能你是,不要。改用xml.sax。使用SAX而不是DOM将显著提高性能。

        通常,我建议使用ElementTree,或者为了提高速度,使用与之相对应的ElementTree。还可以尝试使用(2.6内置)来并行化

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

        import xml.etree.cElementTree as ET
        xml_it = ET.iterparse("some.xml")
        event, elem = xml_it.next()
        
        event
        在本例中始终是字符串
        “end”
        ,但您也可以初始化解析器,以便在解析新元素时告诉您新元素的情况。您不能保证所有的子元素都会在那个时候被解析,但是如果您只对此感兴趣的话,属性就在那里

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


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

        您好,我已经想到了这一点,这就是我选择expat的原因(这是我发现的最快的)。为了反映这一点,我稍微澄清了这个问题。我想知道我是否遗漏了什么,或者我是否可以使用一些技巧来加快速度。正则表达式只适用于XML文档的一小部分,并且充满了隐藏的缺陷,除非您真的、真的知道自己在做什么(例如,您知道如何处理编码和空白的所有排列)@Robert-或者除非您的XML碰巧是以一种简单的方式生成的。这就是接受任何与模式匹配的XML与一堆碰巧生成的XML都是相同的XML之间的区别。您能提供一些关于这些文件的更多信息吗?它们是相同的吗?它们是否都包含所需的信息?为什么ext匹配没有用?一两个例子也会有帮助。你还尝试了哪些解析器?出于非常类似的目的,我测试了
        xml.dom.ext.reader
        ,并且libxml2和libxml2的Python绑定速度更快。@muhuk:文本匹配没有用,因为xml特定的东西,例如搜索“foo”使用文本匹配不会发现“fo;o”,即使它在XML中是相同的东西。另一方面,对于程序员来说,SAX比DOM复杂得多。