将文件转换为字典,值为代码,例如PovScore(1,2)
我有以下数据(7MB),存储在transpostion.txt文件中:
{'0x2df54c975eb48346': [PovScore(Cp(+57), BLACK), 5], ...}
我尝试过
with open("transposition.txt", "r") as file:
x = file.readline()
transposition = eval(x)
del x
但是内存达到了99%,然后就卡住了。我也试过1MB的文件,它能立即加载并设置字符串,但打印的时候非常慢(在IDLE环境下):
>>> with open("testfile.txt", "r") as file:
x = file.read()
>>> x
Squeezed text (2000 lines)
json
模块无法解析JSON,代码如下:
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
json.dumps({'a':PovScore(0,0)})
File "C:\Users\asdfs\AppData\Local\Programs\Python\Python39\lib\json\__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "C:\Users\asdfs\AppData\Local\Programs\Python\Python39\lib\json\encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "C:\Users\asdfs\AppData\Local\Programs\Python\Python39\lib\json\encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "C:\Users\asdfs\AppData\Local\Programs\Python\Python39\lib\json\encoder.py", line 179, in default
raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type PovScore is not JSON serializable
1 个回答
0
@nicomp 帮我找到了解决方案。
写入的代码如下:
with open("transposition.txt", "w") as file:
json.dump(transposition,file, default=lambda o: o.__dict__, indent=4)
解析的代码如下:
with open("transposition.txt") as file:
transposition = json.load(file)
for x in transposition:
if transposition[x][0]["relative"].get("cp")!=None:
transposition[x][0] = PovScore(Cp(transposition[x][0]["relative"]["cp"]), transposition[x][0]["turn"])
elif transposition[x][0]["relative"].get("moves")!=None:
transposition[x][0] = PovScore(Mate(transposition[x][0]["relative"]["moves"]), transposition[x][0]["turn"])
内存问题也解决了,下面是对 eval()
函数和 json
模块的速度测试结果:
eval() /7MB |
json /100MB |
|
---|---|---|
加载 | 电脑卡住(没有格式化) | 立即加载(已格式化) |
写入 | 不适用 | 大约:2分钟 |
内存使用 | 99% | 60% |