python-3.x eval()读取大文件内存错误[重复]

xwmevbvl  于 2023-03-20  发布在  Python
关注(0)|答案(2)|浏览(187)

此问题在此处已有答案

eval vs json.loads memory consumption(1个答案)
16小时前关门了。
我有一个大字典,需要存储和读取,当我生成并写入文件时,没有问题。但当使用eval()读取时,出现内存错误。

# a.py
res: Dict[str, Dict[str, int]] = {}
doSomething()
with open('./data/dic.txt', 'w', encoding='UTF-8') as w:
    w.write(str(res))

在此之前,没有问题,表明我的RAM应该足够。文件大约是800MB。

# b.py
with open('./data/dict.txt', 'r', encoding='UTF-8') as r:
    res: Dict[str, Dict[str, int]] = eval(r.read())

但是当我执行这一步时,MemoryError出现了。

8wigbo56

8wigbo561#

可以使用shelve模块将数据存储在一个“pickle”数据库中,也可以为type指定别名,这样就更容易使用。
使用符合您需要的值替换database_namethis_result_name。如果数据库名称不存在,则将创建该名称。

import shelve

DBEntry = dict[str, dict[str, int]]

out:DBEntry = {'a':{'a1':1}}

#save to database
with shelve.open('./data/database_name') as db:
    db['this_result_name'] = out
     
in_:DBEntry = None

#load from database
with shelve.open('./data/database_name') as db:
    in_ = db.get('this_result_name')

typing.dict从python 3.9开始就被弃用了。builtins.dict现在支持下标。
PEP 585:这个被弃用的功能可能最终会从类型化模块中移除,移除时间不会早于Python 3.9的生命周期结束时间,也就是2025年10月。

hmtdttj4

hmtdttj42#

使用eval不是一个好主意,使用内置的json模块就可以了。
要将其用于给定代码:

# a.py
import json
res: Dict[str, Dict[str, int]] = {}
doSomething()
with open('./data/dic.json', 'w') as w:
    json.dump(res, w)

# b.py
import json
with open('./data/dict.json', 'r') as r:
    res: Dict[str, Dict[str, int]] = json.load(r)

相关问题