Python - 读取使用urllib2打开的xml文件时内存不足

时间:2014-09-02 15:56:27

标签: python urllib2

我有一个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,没有其他线程在运行,没有打开的文件。它怎么能占用这么多记忆呢?

2 个答案:

答案 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")