使用 "load" 时 Dill 删除对象

Dill deletes object when using "load"

我遇到了一个让我抓狂的错误。我生成一些数值模拟数据 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)

发生以下两种情况之一:

  1. 程序说文件丢失 UnpicklingError: [Errno 2] No such file or directory: .../original_directory/sim_data.dill。这意味着 dill 在文件的元数据中放入 original_directory 并在文件移动时拒绝打开它;真正令人震惊的行为。
  2. 当我将文件复制回 new_directory 时,尝试打开它会出现 EOFError 并且 dill 将文件更改为零字节,实际上是删除它。这更糟。

我可以使用标准 with open(simfile, 'r') as f; print f.readlines() 很好地读取文件,但显然这在尝试恢复文件的内部 class 结构时无济于事。

显然这是 dill 的正常行为;请看:

https://github.com/uqfoundation/dill/issues/296

释义:文件位置是要 pickle 的文件句柄的一部分,因此没有该信息就不可能取消 pickle。显然,这意味着如果您将 .dill 文件保存在一个位置,手动移动该文件(例如移动到更方便的目录),然后再次尝试打开它,它将无法正常工作。

关于删除问题,上述post的作者建议使用fmode=FMODE_PRESERVEDATA或以下列出的其他文件模式之一 https://github.com/matsjoyce/dill/blob/087c00899ef55f31d36e7aee51a958b17daf8c91/dill/dill.py#L136-L145