如果有任何解析XML文件(大小= 600M)与unstagle/python 可以请告诉我在事实我使用untangle.parse(file.xml),我得到错误信息: 过程完成退出代码137用600M解析巨大的XML文件
是否有任何方法来解析这个文件通过集团例如或其他选项使用的函数untangle.parse()或特定的Linux配置......?
感谢
如果有任何解析XML文件(大小= 600M)与unstagle/python 可以请告诉我在事实我使用untangle.parse(file.xml),我得到错误信息: 过程完成退出代码137用600M解析巨大的XML文件
是否有任何方法来解析这个文件通过集团例如或其他选项使用的函数untangle.parse()或特定的Linux配置......?
感谢
您可以使用XML 模块萨克斯(简单API XML)解析器。
SAX是流式上下文通过XML和该文档处理线性时尚。
这是有利的,当照例DOM实现使用10字节的存储器以表示XML的1个字节DOM树会消耗太多的存储器。做一些这样的
示例代码:
import xml.sax
def stream_gz_decompress(stream) :
dec = zlib.decompressobj(32 + zlib.MAX_WBITS)
for chunk in stream :
rv = dec.decompress(chunk)
if rv :
yield rv
class stream_handler(xml.sax.handler.ContentHandler) :
last_entry = None
last_name = None
def startElement(self, name, attrs) :
self.last_name = name
if name == 'item':
self.last_entry = {}
elif name != 'root' and name != 'updated' :
self.last_entry[name] = {'attrs': attrs, 'content': ''}
def endElement(self, name):
if name == 'item':
# YOUR APPLICATION LOGIC GOES HERE
self.last_entry = None
elif name == 'root':
raise StopIteration
def characters(self, content):
if self.last_entry:
self.last_entry[self.last_name]['content'] += content
parser = xml.sax.make_parser()
parser.setContentHandler(stream_handler())
with open(os.path.basename('FILENAME'), "rb") as local_file:
for data in stream_gz_decompress(local_file):
parser.feed(data)
退出代码137是一个SIGKILL的结果。 – Vallentin
你可以看看美丽的汤。他们的lxml解析器速度非常快,而在现代系统(4GB + RAM)中,解析600MB文件应该没有问题。 – Mikael