将文件转换为字典,值为代码,例如PovScore(1,2)

0 投票
1 回答
56 浏览
提问于 2025-04-14 17:13

我有以下数据(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%

撰写回答