我遇到了一个让我抓狂的错误。我生成一些数值模拟数据 sim_data.dill
并使用
with open(os.path.join(original_directory, 'sim_data.dill'), 'w' as f:
dill.dump(outputs, f)
此数据约为 1 Gb,需要一段时间才能生成。现在,当我尝试使用
从其他程序加载该文件时,我将该文件从original_directory
复制到 new_directory
simfile = '/new_directory/sim_data.dill'
with open(simfile, 'r') as f:
outputs = dill.load(f)
发生以下两种情况之一:
- 程序表示文件丢失,并显示
UnpicklingError: [Errno 2] No such file or directory: .../
original_directory/sim_data.dill
。这意味着 dill 将original_directory
放入文件的元数据中,并在文件移动时拒绝打开它;真是令人震惊的行为。 - 当我将文件复制回
new_directory
时,尝试打开它会出现EOFError
,并且 dill 将文件更改为零字节,本质上是删除它。这更糟糕。
我可以通过使用标准 with open(simfile, 'r') as f; 来很好地读取文件。 print f.readlines()
,但显然这在尝试恢复文件的内部类结构时没有帮助。
最佳答案
显然这是 dill
的正常行为;请参阅:
https://github.com/uqfoundation/dill/issues/296
释义:文件位置是要 pickle 的文件句柄的一部分,因此在没有该信息的情况下无法对其进行取消 pickle 。显然,这意味着如果您将 .dill
文件保存在一个位置,手动移动该文件(例如移动到更方便的目录),然后尝试再次打开它,它不会工作。
就删除问题而言,上述帖子的作者建议使用 fmode=FMODE_PRESERVEDATA
或列出的其他文件模式之一
https://github.com/matsjoyce/dill/blob/087c00899ef55f31d36e7aee51a958b17daf8c91/dill/dill.py#L136-L145
关于python - Dill 使用 "load"时删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53620238/