2017-03-23 138 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