我有一个python程序,它收集联盟产品供稿并将它们保存为xml文件。其中一些产品供稿非常大,导致内存不足错误。这是我的代码:
xmlfile = urllib2.urlopen(feed.URL)
log.info("Opened the file")
contents = xmlfile.read()
log.info("Read the file")
xmlfile.close()
"打开文件"是记录的最后一件事,所以阅读文件是需要记忆的东西。我无法对文件大小做任何事情。另外,我运行Python 2.7.8 64位。这意味着我能够使用4 GB的RAM吗?文件大小为450mb,没有其他线程在运行,没有打开的文件。它怎么能占用这么多记忆呢?
答案 0 :(得分:3)
不是在解析之前将整个XML文档读入内存,而是从Web流式传输,并在它们进入时解析它们.Doc:https://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.iterparse
感谢@tdelaney的澄清。
import urllib
import xml.etree.ElementTree as ET
URL = 'http://www.w3schools.com/xml/note.xml'
for event,elem in ET.iterparse( urllib.urlopen(URL) ):
print event, elem.__dict__
end {'text': 'Tove', 'attrib': {}, 'tag': 'to', 'tail': '\n\t', '_children': []}
end {'text': 'Jani', 'attrib': {}, 'tag': 'from', 'tail': '\n\t', '_children': []}
end {'text': 'Reminder', 'attrib': {}, 'tag': 'heading', 'tail': '\n\t', '_children': []}
end {'text': "Don't forget me this weekend!", 'attrib': {}, 'tag': 'body', 'tail': '\n', '_children': []}
end {'text': '\n\t', 'attrib': {}, 'tag': 'note', '_children': [<Element 'to' at 0x1968a10>, <Element 'from' at 0x1968a50>, <Element 'heading' at 0x1968b10>, <Element 'body' at 0x1968bd0>]}
答案 1 :(得分:1)
我想要的不是解析文件而是直接保存它。这就是诀窍:
import urllib
testfile = urllib.URLopener()
testfile.retrieve("http://randomsite.com/file.gz", "file.gz")