我使用Python的内置XML解析器来加载1.5 gig XML文件,这需要一整天.
from xml.dom import minidom
xmldoc = minidom.parse('events.xml')
Run Code Online (Sandbox Code Playgroud)
我需要知道如何进入并测量其进度,以便我可以显示进度条.有任何想法吗?
minidom有另一个叫做parseString()的方法,它返回一个DOM树,假设你传递的字符串是有效的XML,如果我自己将文件拆分成块并一次一个地传递给parseString,我是否可能合并所有的DOM树在最后重新组合在一起?
您是否考虑过使用其他解析XML的方法?构建这样一个大型XML文件的树总是很慢并且内存密集.如果你不需要在内存中的整个树,基于流的解析会多快.如果你已经习惯了基于树的XML操作,那可能会有点令人生畏,但它会以巨大的速度增加(几分钟而不是几小时)的形式付出代价.
http://docs.python.org/library/xml.sax.html
你使用case要求你使用sax解析器而不是dom,dom将所有内容加载到内存中,sax会逐行解析,你可以根据需要为事件编写处理程序,这样可以有效,你也可以编写进度指示器
我还建议尝试使用expat解析器,它非常有用 http://docs.python.org/library/pyexpat.html
使用sax进度:
当sax以递增方式读取文件时,您可以将自己传递的文件对象包装起来并跟踪已读取的内容.
编辑:我也不喜欢自己拆分文件和加入DOM的想法,这样你最好编写自己的xml解析器,我建议使用sax解析器我也想知道你在DOM树中读取1.5 gig文件的目的是什么?看起来像萨克斯在这里会更好