保存程序的状态以允许它恢复[重复]
Posted
技术标签:
【中文标题】保存程序的状态以允许它恢复[重复]【英文标题】:Saving the state of a program to allow it to be resumed [duplicate] 【发布时间】:2011-04-06 15:27:43 【问题描述】:我偶尔会遇到需要很长时间才能运行的 Python 程序,并且我希望能够保存其状态并在以后恢复。有没有人有一个聪明的方法可以每隔 x 秒保存一次状态,或者在程序退出时保存状态?
【问题讨论】:
【参考方案1】:将所有“状态”数据放在一个地方并使用pickle。
pickle 模块实现了一种基本但强大的算法,用于序列化和反序列化 Python 对象结构。 “Pickling”是将 Python 对象层次结构转换为字节流的过程,而“unpickling”是逆操作,从而将字节流转换回对象层次结构。酸洗(和解酸)也称为“序列化”、“编组”、1 或“扁平化”,但为避免混淆,此处使用的术语是“酸洗”和“解酸”。
【讨论】:
我还没有机会尝试,但这听起来正是我所需要的。谢谢 如何找到我所有的“状态”数据?我认为这不是问题的直接答案。 他的意思是收集您关心的所有数据/重新启动流程所需的所有数据。您基本上是在编写自己的自定义保存/加载并使用 pickle 来获取磁盘的保存/加载部分,因此查找所有“状态”数据取决于您,没有一般的答案。 #lateisbetterthannever【参考方案2】:如果您想保存所有内容,包括整个命名空间和当前正在执行的代码行以随时重新启动,那么没有标准库模块可以做到这一点。
正如另一张海报所说,pickle 模块可以将几乎所有内容保存到一个文件中,然后再次加载它,但是您必须围绕 pickle 模块专门设计您的程序(即保存您的“状态” - 包括变量,等等——在一个班级里)。
【讨论】:
【参考方案3】:如果您对 OOP 没问题,请考虑为每个类创建一个方法,将序列化版本(使用 pickle)输出到文件。然后添加第二种方法以在实例中加载数据,如果存在腌制文件,则调用加载方法而不是处理方法。 我将这种方法用于 ML,它确实促进了我的工作流程。
【讨论】:
【参考方案4】:在传统的编程方法中,在某个执行点之后保存变量或对象状态的明显方法是序列化。
所以如果你想在一些已经计算过的繁重状态之后执行程序,我们只需要从反序列化部分开始。
这些步骤主要在数据科学建模中最需要,我们加载一个巨大的 CSV 或其他一些数据并计算它,我们不想在每次运行程序时都重新计算。
http://jupyter.org/ - 无需您手动操作即可自动执行这些序列化/反序列化的工具。
您需要做的就是执行您的 Python 代码的选定部分,比如第 10-15 行,这取决于之前的第 1-9 行。 Jupyter 会为你保存 1-9 的状态。探索教程并尝试一下。
【讨论】:
以上是关于保存程序的状态以允许它恢复[重复]的主要内容,如果未能解决你的问题,请参考以下文章