如何腌制或存储Jupyter(IPython)笔记本会话以供以后使用


99

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


我想什么爱做的是pickle或存储整个Jupyter会话(所有大熊猫dataframes,np.arrays,变量,...),所以我可以放心地关闭服务器知道我可以在完全相同的状态返回到我的会话之前。

从技术上讲甚至可行吗?有没有我忽略的内置功能?


编辑:根据这个答案,有一种%store 魔法应该是“轻型泡菜”。但是,您必须像这样手动存储变量:

#inside a ipython/nb session
foo = "A dummy string"
%store foo
关闭种子,重新启动内核#r
%store -r foo进行刷新
print(foo) # "A dummy string"

这与我想要的功能相当接近,但是由于必须手动执行并且无法区分不同的会话,因此它的用处不大。


1
有什么进展吗?我只注意到Spyder IDE中有一个工作区,可以将变量保存到* .mat中。但不确定是否可以将其移植到Jupyter Notebook中。
cqcn1991 '16

您是否考虑过pypi.python.org/pypi/dill?“莳萝还提供以下功能:-保存和加载python解释器会话”虽然是python,但不确定ipython或内核还涉及什么
piccolbo

Answers:


64

我认为迪尔很好地回答了您的问题。

pip install dill

保存笔记本会话:

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

恢复笔记本会话:

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

资源


1
当有发电机时,它会失败(当我想到时,这是有道理的),但似乎这是我们可以期望的接近!
罗宾·内默斯

1
对我来说很棒。请记住以下几点:首先,如果周围挂有pyodbc连接对象,则需要将其关闭,然后将它们全部设置为None,否则会出现“ TypeError:无法腌制pyodbc.Connection对象”错误。其次,笔记本状态不包括由代码生成的图形,因此您需要重新运行单元格以将其带回。
Michael Szczepaniak

但它不起作用,我在另一台计算机上使用了保存的文件
Jaya A

27

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

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

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

然后在产生它们时存储任何新变量

backup['var1'] = var1

最后,可能是一个好主意

backup.close()

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

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

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


5
这是一个非常有趣的解决方法,但是我可以从字面上感受到与维护此类系统相关的痛苦。谢谢你的小贴士:)
Robin Nemeth

19

这个问题涉及到:如何在IPython Notebook中进行缓存?

为了保存单个单元的结果,缓存魔术派上了用场。

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

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

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

缓存魔法救不了整个笔记本的状态还没有。据我所知,还没有其他系统可以恢复“笔记本”。这将需要保存python内核的所有历史记录。加载笔记本电脑并连接到内核后,应加载此信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.