exec语句的内存错误

时间:2014-06-26 17:43:40

标签: python

我有一个带有大字典的文本文件 - 它看起来像这样:

{"0_3":[(80.10858194902539,-175.29917925596237,1)   ],"10_10":[(50.610770881175995,-57.17018913477659,1)    , (52.946319971233606,-66.9017181918025,1)].........}

它的大小约为138 MB,我需要使用这个字典并访问我的python代码中的值。所以,我有以下代码片段(diction.txt是文件,我希望我的spot变量中的字典):

with open("diction.txt","r") as myfile:
    data = myfile.read().replace('\n','')

exec("spots = " + data)

但是,当我运行它时,我得到一个内存错误,我不确定这是因为文件的大小或其他东西,如果大小是问题,我怎么能让它工作?

感谢您的帮助!

编辑: 解决方案:

@DrV在评论中指出的解决方案是摆脱我文件中的parantheses,因为JSON无法识别元组,使用以下代码:

import json 

with open("diction.txt","r") as myfile:
    data = myfile.read().replace('\n','').replace('(','').replace(')','')
spots = json.loads(data)

然后更改我的其余代码以适应我将格式从元组更改为连续列表的事实。

2 个答案:

答案 0 :(得分:5)

使用execeval总是有点危险,最好避免使用。您的数据结构似乎可以通过以下方式进行评估:

import ast

with open("diction.txt","r") as myfile:
    data = myfile.read().replace('\n','')

mydata = ast.literal_eval(data)

这里的区别在于ast.literal_eval不会将您的数据视为程序代码而是数据。该程序更轻,更安全。

然而,其他人报告了ast.literal_eval的挑战。它仍然比你需要的更复杂:

Loading 41MB file by ast.literal_eval causes MemoryError

如果您有可能将文件格式更改为符合JSON标准,那么您可以使用json模块进行编写和阅读。 JSON数据毕竟比python字典转储更常见。使用元组时,您的数据似乎与JSON分开。如果你把它们改成列表,你应该好好去。

有关这些选项的更多讨论,请参阅:

python eval vs ast.literal_eval vs JSON decode

如果(以及可能何时)您最终使用JSON,则会有不同的库。如果标准python json在解码阶段太慢,您可以使用,例如ujson广告宣传速度非常快。

答案 1 :(得分:2)

听起来你可以这样做

with open("diction.txt","r") as myfile:
    data = json.load(myfile)

它可能会引发一些错误..很难说......但是如果你可以将你的大文件编码为json而不是很可能会有很多帮助