如何腌制或存储 Jupyter (IPython) notebook session 以备后用

How to pickle or store Jupyter (IPython) notebook session for later

假设我正在 Jupyter/Ipython 笔记本中进行更大的数据分析,并完成了大量耗时的计算。然后,由于某些原因,我不得不关闭我的jupyter本地服务器,但我想return稍后再进行分析,而不必再次进行所有耗时的计算。


喜欢喜欢做的是pickle或存储整个Jupyter会话(所有pandas数据帧、np.arrays、变量, ...) 这样我就可以安全地关闭服务器,因为我知道我可以 return 我的会话处于与以前完全相同的状态。

技术上可行吗?是否有我忽略的内置功能?


编辑: 基于 this answer there is a %store magic,应该是 "lightweight pickle"。但是,您必须像这样手动存储变量:

#inside a ipython/nb session
foo = "A dummy string"
%store foo
关闭seesion,重启内核
%store -r foo # r 用于刷新
print(foo) # "A dummy string"

这与我想要的非常接近,但是必须手动执行并且无法区分不同的会话使得它不太有用。

(我宁愿发表评论也不愿将其作为实际答案提供,但我需要更多的声誉才能发表评论。)

您可以系统地存储大多数类似数据的变量。我通常做的是将所有数据帧、数组等存储在 pandas.HDFStore 中。在笔记本的开头声明

backup = pd.HDFStore('backup.h5')

然后在生成新变量时存储它们

backup['var1'] = var1

最后,可能是个好主意

backup.close()

在关闭服务器之前。下次您想继续使用笔记本时:

backup = pd.HDFStore('backup.h5')
var1 = backup['var1']

说实话,我也更喜欢 ipython 笔记本中的内置功能。您无法以这种方式保存所有内容(例如对象、连接),并且很难用这么多样板代码来组织笔记本。

这个问题是关于:

要保存单个单元格的结果,caching magic就派上用场了。

%%cache longcalc.pkl var1 var2 var3
var1 = longcalculation()
....

重新运行笔记本时,此单元格的内容将从缓存中加载。

这并不能完全回答您的问题,但当所有冗长的计算结果快速恢复时,这可能就足够了。这结合点击笔记本顶部的 运行-all 按钮对我来说是一个可行的解决方案。

缓存魔法无法保存整个笔记本的状态yet。据我所知,目前还没有其他系统可以恢复 "notebook"。这需要保存 python 内核的所有历史记录。加载笔记本并连接到内核后,应加载此信息。

我认为 Dill 很好地回答了你的问题。

pip install dill

保存笔记本会话:

import dill
dill.dump_session('notebook_env.db')

恢复笔记本会话:

import dill
dill.load_session('notebook_env.db')

Source