如果有任何解析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