【问题标题】:Showing progress of python's XML parser when loading a huge file加载大文件时显示 python 的 XML 解析器的进度
【发布时间】:2010-11-03 08:45:50
【问题描述】:

我使用 Python 内置的 XML 解析器来加载一个 1.5 gig 的 XML 文件,这需要一整天。

from xml.dom import minidom
xmldoc = minidom.parse('events.xml')

我需要知道如何进入其中并衡量其进度,以便显示进度条。 有什么想法吗?

minidom 有另一种称为 parseString() 的方法,它返回一个 DOM 树,假设您传递的字符串是有效的 XML,如果我自己将文件拆分成块并一次将它们传递给 parseString,我可以最后将所有的 DOM 树合并到一起?

【问题讨论】:

    标签: python xml pyqt


    【解决方案1】:

    您的用例要求您使用 sax 解析器而不是 dom,dom 将所有内容加载到内存中,而 sax 将逐行解析,并根据需要为事件编写处理程序 所以可能很有效,您也可以编写进度指示器

    我还建议在某个时候尝试 expat 解析器,它非常有用 http://docs.python.org/library/pyexpat.html

    使用萨克斯的进步:

    随着 sax 以增量方式读取文件,您可以使用自己的文件对象包装您传递的文件对象并跟踪已读取的内容。

    编辑: 我也不喜欢自己拆分文件并在最后加入 DOM,这样你最好编写自己的 xml 解析器,我建议改用 sax 解析器 我还想知道您在 DOM 树中读取 1.5 gig 文件的目的是什么? 看起来萨克斯在这里会更好

    【讨论】:

    • 这看起来像我需要的,我绝对不需要内存中的整个 DOM。我会试试 SAX
    【解决方案2】:

    您是否考虑过使用其他解析 XML 的方法?构建如此大的 XML 文件的树总是很慢并且占用大量内存。如果您不需要内存中的整个树,则基于流的解析会快得多。如果您习惯于基于树的 XML 操作,这可能会有点令人生畏,但它会以巨大的速度提升(几分钟而不是几小时)的形式付出代价。

    http://docs.python.org/library/xml.sax.html

    【讨论】:

      【解决方案3】:

      我有一些非常相似的 PyGTK,而不是 PyQt,使用 pulldom api。它使用 Gtk 空闲事件(因此 GUI 不会锁定)和 Python 生成器(以保存解析状态)一次调用一点。

      def idle_handler (fn):
        fh = open (fn)  # file handle
        doc = xml.dom.pulldom.parse (fh)
        fsize = os.stat (fn)[stat.ST_SIZE]
        position = 0
      
        for event, node in doc:
          if position != fh.tell ():
            position = fh.tell ()
            # update status: position * 100 / fsize
      
          if event == ....
      
          yield True   # idle handler stays until False is returned
      
       yield False
      
      def main:
        add_idle_handler (idle_handler, filename)
      

      【讨论】:

        【解决方案4】:

        最后合并树会很容易。您可以只创建一个新的 DOM,然后将各个树一一添加到它上面。这也可以让您对解析的进度进行非常精细的控制。如果您愿意,您甚至可以通过生成不同的进程来解析每个部分来并行化它。您只需要确保智能拆分它(而不是在标签中间拆分等)。

        【讨论】:

          猜你喜欢
          • 2012-04-22
          • 1970-01-01
          • 1970-01-01
          • 2020-10-16
          • 2011-03-17
          • 1970-01-01
          • 1970-01-01
          • 2020-11-19
          • 1970-01-01
          相关资源
          最近更新 更多