python - 如果 pickling 被打断,unpickling 一定会失败吗? - Python

标签 python

假设我尝试将 pickle 对象写入磁盘的尝试由于崩溃而未完成。尝试对对象进行 unpickle 总是 是否会导致异常,或者写出的片段是否有可能被解释为有效的 pickle 而错误没有被注意到?

最佳答案

与提供的其他答案相反,我相信我们可以就泡菜的可恢复性提出强有力的论据。答案是:“是的,不完整的泡菜总是会导致异常。”

为什么我们能够做到这一点?因为“pickle”格式实际上是一种基于堆栈的小型语言。在基于堆栈的语言中,您编写的代码将一项接一项地压入堆栈,然后调用一个运算符来处理您积累的数据。碰巧 pickle 必须以命令“.”结尾,它表示:“取出现在位于堆栈底部的项目并将其作为此 pickle 的值返回。”如果你的 pickle 被提前切掉,它不会以这个命令结束,你会得到一个 EOF 错误。

如果你想尝试恢复一些数据,你可能必须编写自己的解释器,或者在某个地方调用 pickle.py 来绕过它在完成解释堆栈而没有找到“.”时想要引发 EOFError。要记住的主要事情是,在大多数基于堆栈的语言中,大数据结构是“向后”构建的:首先将许多小字符串或数字放在堆栈上,然后调用表示“将它们放在一个列表中”或“在堆栈中抓取成对的项目并制作字典”的操作。因此,如果 pickle 被打断,您会发现堆满了将要构建的对象的各个部分,但是您将错过告诉您什么将要构建的最终代码从碎片中构建。

关于python - 如果 pickling 被打断,unpickling 一定会失败吗? - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1653897/

相关文章:

python - 处理 diff 文件中的修改

python - 加载没有模块的源文件

python - 处理 pandas DF 中的重复索引

python - 如何在 python 中存储一个大 int 而不用 len() 计算换行符?

python - 无限嵌套列表中到底发生了什么?

python - 使用 scipy.fftpack 时出现内存错误,如何避免?

python - 值错误 : unknown url type

python - 形状不匹配 : value array of shape X could not be broadcast to indexing result of shape . 。 . X?

python - 递归后序树导航

python - 获取python应用程序内存使用情况