Comment décaper ou stocker une session de notebook Jupyter (IPython) pour plus tard

101

Disons que je fais une analyse de données plus large dans le notebook Jupyter / Ipython avec beaucoup de calculs chronophages. Ensuite, pour une raison quelconque, je dois arrêter le serveur local jupyter I, mais je voudrais revenir à l'analyse plus tard, sans avoir à refaire tous les calculs chronophages.


Ce que je veux l' amour à faire est pickleou stocker toute la session Jupyter (tous les pandas géants dataframes, np.arrays, variables, ...) pour que je puisse arrêter en toute sécurité le serveur sachant que je peux revenir à ma session exactement le même état que avant.

Est-ce même techniquement possible? Y a-t-il une fonctionnalité intégrée que j'ai négligée?


EDIT: sur la base de cette réponse, il existe une %store magie qui devrait être "pickle léger". Cependant, vous devez stocker les variables manuellement comme ceci:

#inside a ipython/nb session
foo = "A dummy string"
%store foo
fermeture de seeion, redémarrage du noyau
%store -r foo # r pour actualisation
print(foo) # "A dummy string"

ce qui est assez proche de ce que je souhaiterais, mais devoir le faire manuellement et ne pas pouvoir faire la distinction entre les différentes sessions le rend moins utile.

Robin Nemeth
la source
1
Des progrès à ce sujet? J'ai seulement remarqué qu'il y a un espace de travail dans Spyder IDE qui peut enregistrer des variables dans * .mat. Mais je ne sais pas si cela pourrait être porté dans Jupyter Notebook.
cqcn1991
Avez-vous envisagé pypi.python.org/pypi/dill ? "aneth fournit également la capacité de: - sauvegarder et charger des sessions d'interpréteur python" C'est python cependant, je ne sais pas quoi d'autre est impliqué avec ipython ou un noyau
piccolbo

Réponses:

64

Je pense que Dill répond bien à votre question.

pip install dill

Enregistrer une session Notebook:

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

Restaurer une session Notebook:

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

La source

MétalloyD
la source
1
échoue quand il y a des générateurs (ce qui a du sens quand j'y pense), mais il semble que c'est aussi proche que nous pouvons espérer!
Robin Nemeth
1
A très bien fonctionné pour moi. Quelques points à garder à l'esprit: Premièrement, si vous avez des objets de connexion pyodbc qui traînent, vous devrez les fermer, puis les définir tous sur None, sinon vous obtenez une erreur "TypeError: can't pickle pyodbc.Connection objects" . Deuxièmement, l'état du bloc-notes n'inclut pas les graphiques générés par votre code, vous devrez donc réexécuter les cellules pour les ramener.
Michael Szczepaniak
Mais cela ne fonctionne pas J'ai utilisé le fichier enregistré sur une autre machine
Jaya A
Aneth installé. Dois-je importer dill dill.dump_session ('notebook_env.db') à partir de la ligne de commande?
cheznead
Non, vous devrez le faire lors de l'exécution du notebook Jupyter. Le dump_session et le load_session doivent tous deux passer par le notebook. Votre load_session peut être au début du notebook. Et le dump_session peut être à la toute fin du cahier.
MetalloyD
27

(Je préfère commenter plutôt que d'offrir cela comme une réponse réelle, mais j'ai besoin de plus de réputation pour commenter.)

Vous pouvez stocker la plupart des variables de type données de manière systématique. Ce que je fais habituellement, c'est stocker toutes les dataframes, tableaux, etc. dans pandas.HDFStore . Au début du cahier, déclarez

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

puis stockez toutes les nouvelles variables au fur et à mesure que vous les produisez

backup['var1'] = var1

À la fin, probablement une bonne idée à faire

backup.close()

avant d'éteindre le serveur. La prochaine fois que vous voudrez continuer avec le notebook:

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

À vrai dire, je préférerais également les fonctionnalités intégrées dans le notebook ipython. Vous ne pouvez pas tout enregistrer de cette façon (par exemple, les objets, les connexions), et il est difficile de garder le cahier organisé avec autant de codes passe-partout.

Anh Huynh
la source
5
C'est une solution de contournement très intéressante, mais je peux littéralement ressentir la douleur associée au maintien d'un tel système. Merci pour le tuyau tho :)
Robin Nemeth
19

Cette question est liée à: Comment mettre en cache dans IPython Notebook?

Pour enregistrer les résultats de cellules individuelles, la magie de la mise en cache est pratique.

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

Lors de la réexécution du notebook, le contenu de cette cellule est chargé à partir du cache.

Cela ne répond pas exactement à votre question, mais cela pourrait suffire à récupérer rapidement les résultats de tous les longs calculs. Ceci, en combinaison avec le bouton pour tout exécuter sur le dessus du portable, est pour moi une solution réalisable.

La magie du cache ne peut pas enregistrer l'état d'un ordinateur portable ensemble encore . A ma connaissance il n'y a pas encore d'autre système pour reprendre un "notebook". Cela nécessiterait de sauvegarder toute l'histoire du noyau python. Après avoir chargé le notebook et connecté à un noyau, ces informations doivent être chargées.

Vasco
la source