如何执行酸洗以防止崩溃?

How to perform a pickling so that it is robust against crashing?

我经常使用 pickle.dump() 在 Python 2.7 中保存大文件。在我的代码中,我有一个 .pickle 文件,我会随着代码的每次迭代不断更新,每次都会覆盖同一个文件。

但是,我偶尔会遇到崩溃(例如服务器问题)。这可能发生在 pickle 转储的中间,导致 pickle 不完整并且 pickle 文件不可读,并且我丢失了过去迭代的所有数据。

我想我可以做到的一种方法是为每次迭代保存一个 .pickle 文件,然后将它们全部合并。是否有任何其他推荐的方法,或写入磁盘的最佳实践,以防止崩溃?

您正在有效地进行备份,因为您的目标是相同的:灾难恢复,尽可能少地丢失工作。

在备份中,有这些标准做法,因此请选择最适合您的做法:

  • 正在备份
    • 完整备份(每次都保存所有内容)
    • 增量备份(仅保存自上次备份以来更改的内容)
    • 差异备份(仅保存自上次 完整 备份以来更改的内容)
  • 处理旧备份
    • 循环 buffer/rotating 副本(删除或覆盖早于 X days/iterations 的备份,可选择更改其他名称中的索引)
    • 将旧的 incremental/differential 副本合并到之前的完整备份中(作为故障保险,合并到一个新文件中,然后才删除旧的)

Are there any other recommended methods, or best practices ?

让我提一下很酷的 Mike McKearn 的 dill

import dill as pickle

pickle.dump_session( aRotatingIndexFileNAME ) # saves python session-state
#                                             # session is worth
#                                             # many computing [CPU-core * hrs]

如果需要,就

import dill as pickle; pickle.load_session( aLastSessionStateFileNAME )

使用轮换文件名是一种常见的最佳做法,可用于归档达到一定深度的回滚功能,因此不值得在此重复。

dill 确实在这方面救了我,包括故意使用相同的呼号以便轻松替换到 python 项目中。