我正在处理大约85MB大小的XML文件。目前我正试着处理一个。我要做的是下载一个zip,解压缩到磁盘,然后将XML转换成Python Dict,更改一些内容,然后保存Dict,并将其发送到MongoDB。除非我要转换成Python dict,否则进程会冻结/消失。。
我在一个有Ubuntu13.04服务器的虚拟机上运行这个脚本,4个内核,2.6,16GB内存,1TB 15000rpm。我在监控脚本的运行,基本上python在7分钟内占用了12%的RAM,然后就消失了,进程从我的高使用率列表中掉了下来,我的管道从终端就是不移动。我用CTRL+Z终止它并返回“Write failed:brokend pipe”。
终端上打印的最后一件事是转换每日价格_0505_欧元.xml.zip“,这让我怀疑xmltodict可能有什么问题,但我确实被卡住了。有数据的示例代码应该适用于任何愿意帮助我测试这一点的人。感谢任何帮助!谢谢。
#Importing
import urllib, xmltodict, os
from zipfile import ZipFile
#Getting Working Dir
abspath = os.path.abspath(__file__)
root = os.path.dirname(abspath) + "/"
print "Current Working Directory: " + root
#Defining
urlAuth = 'https://dl.dropboxusercontent.com/u/9235267/'
dailypriceFL = ['dailyprice_0505_eur.xml.zip']
dailyPriceDict = {}
for x in dailyPriceFL:
print ' * Downloading',x
urllib.urlretrieve(urlAuth+x, x)
print ' * Extracting',x
with ZipFile(x, "r") as z:
z.extractall(root)
print ' * Converting',x
f = open(root+x.replace(".zip",""))
data = xmltodict.parse(f.read())
f.close()
print ' * Adding Currency to Dict',x
for y in data['prices']['price']:
y.update({"currency": x[-7:].replace(".xml","").upper()})
print ' * Ammending',x
dailyPriceDict.update(data)
print ' * Deleting',x
os.remove(root+x)
os.remove(root+x.replace(".zip",""))
print ' * Finished',x
我想知道这是否不是一个内存错误,尽管你列出的规格。当我试图在
xml.dom.minidom
中加载XML时,我得到的是:不过,这似乎对我来说是有效的:
^{pr2}$我的系统需要将近800Mb的内存,但我似乎没有出错。但是,如果在尝试使用minidom之后尝试将其解析为xmltodict,则会得到类似这样的结果:
这相当直接地表明,由于两者都基于
expat
,在运行脚本(或循环的迭代)之间没有释放出一些内容,您需要以某种方式进行重构。在相关问题 更多 >
编程相关推荐