Python进程在处理大型Dict时消失和冻结?

2024-09-21 03:02:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理大约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

Tags: 脚本终端data进程osrootxmlzip
1条回答
网友
1楼 · 发布于 2024-09-21 03:02:35

我想知道这是否不是一个内存错误,尽管你列出的规格。当我试图在xml.dom.minidom中加载XML时,我得到的是:

Traceback (most recent call last):
  File "c:\python27\lib\xml\dom\minidom.py", line 1930, in parseString
    return expatbuilder.parseString(string)
  File "c:\python27\lib\xml\dom\expatbuilder.py", line 940, in parseString
    return builder.parseString(string)
  File "c:\python27\lib\xml\dom\expatbuilder.py", line 223, in parseString
    parser.Parse(string, True)
  File "c:\python27\lib\xml\dom\expatbuilder.py", line 751, in start_element_handler
    node = minidom.Element(qname, uri, prefix, localname)
  File "c:\python27\lib\xml\dom\minidom.py", line 653, in __init__
    self._attrs = {}   # attributes are double-indexed:
MemoryError

不过,这似乎对我来说是有效的:

^{pr2}$

我的系统需要将近800Mb的内存,但我似乎没有出错。但是,如果在尝试使用minidom之后尝试将其解析为xmltodict,则会得到类似这样的结果:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\python27\lib\site-packages\xmltodict.py", line 228, in parse
    parser.Parse(xml_input, True)
xml.parsers.expat.ExpatError: out of memory: line 1, column 0

这相当直接地表明,由于两者都基于expat,在运行脚本(或循环的迭代)之间没有释放出一些内容,您需要以某种方式进行重构。在

相关问题 更多 >

    热门问题