我有一本包含数据框的字典。
dictionary = {"key1": df1,
"key2": df2, and so on...}
Run Code Online (Sandbox Code Playgroud)
很少有 stackoverflow 帖子和 reddit 建议使用 Json 模块和 pickle 模块。
最有效的方法是什么?为什么?
当我将小字典转换为 pickle 时,它的内存小于 0kb 并呈现,这EOFError: Ran out of input在此处进行了解释为什么我在读取空文件时会收到“Pickle - EOFError:Ran out of input”?
我在服务器上运行了几个脚本,这些脚本可以对各种字典进行pickle和unpickle.它们都使用相同的基本代码进行酸洗,如下所示:
SellerDict=open('/home/hostadl/SellerDictkm','rb')
SellerDictionarykm=pickle.load(SellerDict)
SellerDict.close()
SellerDict=open('/home/hostadl/SellerDictkm','wb')
pickle.dump(SellerDictionarykm,SellerDict)
SellerDict.close()
Run Code Online (Sandbox Code Playgroud)
除了其中一个脚本外,所有脚本运行正常.有问题的那个去各个网站并擦除数据并将其存储在字典中.这段代码运行一整天的酸洗和解毒词典,并在午夜停止.然后一个cronjob第二天早上又开始了.此脚本可以运行数周而不会出现问题,但是当脚本尝试打开字典时,由于EOFError而导致脚本每月大约一次.字典的大小通常约为80 MB.我甚至尝试在SellerDict.close()之前添加SellerDict.flush()来挑选数据以确保晚上被刷新.
有什么想法可能导致这种情况?Python非常可靠,所以我不认为这是由于文件的大小.在死亡之前代码运行良好很长时间,这让我相信可能在字典中保存了导致此问题的东西,但我不知道.
此外,如果你知道一个更好的方法来保存除了泡菜之外的词典,我愿意接受选择.就像我之前说的那样,词典不断被打开和关闭.只是为了澄清,只有一个程序将使用相同的字典,因此问题不是由试图访问同一字典的几个程序引起的.
更新:
这是我从日志文件中获得的回溯.
Traceback (most recent call last):
File "/home/hostadl/CompileRecentPosts.py", line 782, in <module>
main()
File "/home/hostadl/CompileRecentPosts.py", line 585, in main
SellerDictionarykm=pickle.load(SellerDict)
EOFError
Run Code Online (Sandbox Code Playgroud) 我看到这个错误被发布了很多,通常是由于文件在打开后没有正确关闭。但由于我使用的是集成的 torch.load() 函数,我不确定我可以做些什么不同的事情。
首先是保存部分:
torch.save({
'model_state_dict': agent.dqn.state_dict(),
...
'loss_history': agent.losshistory
}, modelpath)
Run Code Online (Sandbox Code Playgroud)
这里是加载部分,我也收到了错误消息:
if os.path.exists(modelpath):
checkpoint = torch.load(modelpath)
agent.dqn.load_state_dict(checkpoint['model_state_dict'])
...
agent.losshistory = checkpoint['loss_history']
Run Code Online (Sandbox Code Playgroud)
和这里的错误:
Traceback (most recent call last):
File "c:/Users/levin/Desktop/programming/main.py", line 33, in <module>
checkpoint = torch.load(modelpath)
File "C:\Users\levin\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\serialization.py", line 529, in load
return _legacy_load(opened_file, map_location, pickle_module, **pickle_load_args)
File "C:\Users\levin\AppData\Local\Programs\Python\Python37\lib\site-packages\torch\serialization.py", line 702, in _legacy_load
result = unpickler.load()
EOFError: Ran out of input
Run Code Online (Sandbox Code Playgroud)
我还想提到的一件事是,我多次使用这个确切的代码没有问题。我不记得更改任何可能导致错误的内容。