显示加载大文件时python的XML解析器的进度

问题描述:

Im使用内置的XML解析器加载1.5 gig XML文件并需要一整天。显示加载大文件时python的XML解析器的进度

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

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

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

你的用例需要您使用SAX解析器而非DOM,DOM加载在内存中的一切,萨克斯,而不是将行解析做线和你写的事件处理程序,因为你需要 所以可能是有效的,你会能够编写进度指示器也

我还建议使用SAX试图expat解析器有时它是非常有用 http://docs.python.org/library/pyexpat.html

进步:

随着sax逐步读取文件,您可以将自己传递的文件对象封装起来,并跟踪读取了多少文件。

编辑: 我也做分裂文件你们自己不喜欢的想法,并在末端连接DOM,这样可以帮助您更好地编写自己的XML解析器,我建议不使用SAX解析器 我也想知道你的阅读目的DOM树中的1.5 gig文件? 看起来像萨克斯在这里会更好

+0

这看起来像我所需要的,我绝对不需要在内存中的整个DOM。我会尝试SAX – Nathan 2009-06-17 02:32:15

在最后合并树会很容易。您可以创建一个新的DOM,并且基本上将逐个树添加到它。这可以让你很好地调整解析过程。如果你想通过产生不同的进程来解析每一部分,你甚至可以并行化它。你只需要确保你智能地分割它(而不是在标签中间分割等等)。

您是否考虑过使用其他方式解析XML?构建这种大型XML文件的树总是会很慢并且内存密集。如果你不需要内存中的整个树,基于流的解析将会更快,更容易。如果你习惯了基于树的XML操作,它会有点令人生畏,但它会以巨大的速度提高(几分钟而不是几小时)的形式付出。

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

我有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)