2017-03-23 94 views
0

如果有任何解析XML文件(大小= 600M)与unstagle/python 可以请告诉我在事实我使用untangle.parse(file.xml),我得到错误信息: 过程完成退出代码137用600M解析巨大的XML文件

是否有任何方法来解析这个文件通过集团例如或其他选项使用的函数untangle.parse()或特定的Linux配置......?

感谢

+0

退出代码137是一个SIGKILL的结果。 – Vallentin

+0

你可以看看美丽的汤。他们的lxml解析器速度非常快,而在现代系统(4GB + RAM)中,解析600MB文件应该没有问题。 – Mikael

回答

0

您可以使用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) 
-1

很可能使用SAX与排解?意味着我的萨克斯加载文件和排解,读它,因为我有很多的代码写使用老鹰,我开发了很长时间,我不想从头开始重新启动 谢谢

+0

不是答案。应该删除并作为评论 – jaromrax