Cómo encurtir o almacenar la sesión de cuaderno de Jupyter (IPython) para más tarde

101

Digamos que estoy haciendo un análisis de datos más grande en el cuaderno Jupyter / Ipython con muchos cálculos que consumen mucho tiempo. Luego, por alguna razón, tengo que apagar el servidor local de jupyter I, pero me gustaría volver a hacer el análisis más tarde, sin tener que volver a realizar todos los cálculos que consumen mucho tiempo.


Lo que me gustaría hacer es picklealmacenar toda la sesión de Jupyter (todos los marcos de datos de pandas, np.arrays, variables, ...) para poder apagar el servidor de forma segura sabiendo que puedo volver a mi sesión exactamente en el mismo estado que antes de.

¿Es incluso técnicamente posible? ¿Hay alguna funcionalidad incorporada que pasé por alto?


EDITAR: en base a esta respuesta, hay una %store magia que debería ser "pepinillo ligero". Sin embargo, debe almacenar las variables manualmente de esta manera:

#inside a ipython/nb session
foo = "A dummy string"
%store foo
cerrando seion, reiniciando kernel
%store -r foo # r para actualizar
print(foo) # "A dummy string"

que está bastante cerca de lo que me gustaría, pero tener que hacerlo manualmente y no poder distinguir entre diferentes sesiones lo hace menos útil.

Robin Nemeth
fuente
1
¿Algún progreso en esto? Solo noté que hay un espacio de trabajo en Spyder IDE que puede guardar variables en * .mat. Pero no estoy seguro de si esto se podría trasladar a Jupyter Notebook.
cqcn1991
¿Ha considerado pypi.python.org/pypi/dill ? "eneldo también proporciona la capacidad de: - guardar y cargar sesiones de intérprete de Python" Sin embargo, eso es Python, no estoy seguro de qué más está involucrado con ipython o un kernel
piccolbo

Respuestas:

64

Creo que Dill responde bien a tu pregunta.

pip install dill

Guardar una sesión de Notebook:

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

Restaurar una sesión de Notebook:

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

Fuente

MetalloyD
fuente
1
falla cuando hay generadores (lo cual tiene sentido cuando lo pienso), ¡pero parece que esto es lo más cerca que podemos esperar!
Robin Nemeth
1
Funcionó muy bien para mí. Un par de cosas a tener en cuenta: Primero, si tiene objetos de conexión pyodbc colgando, deberá cerrarlos y luego establecerlos en Ninguno; de lo contrario, obtendrá un error "TypeError: no se pueden encuadrar objetos de conexión pyodbc". . En segundo lugar, el estado del cuaderno no incluye los gráficos generados por su código, por lo que deberá volver a ejecutar las celdas para recuperarlos.
Michael Szczepaniak
Pero no funciona Usé el archivo guardado en otra máquina
Jaya A
Eneldo instalado. ¿Importo dill dill.dump_session ('notebook_env.db') desde la línea de comando?
cheznead
No, deberá hacerlo mientras ejecuta el portátil Jupyter. Tanto dump_session como load_session deben realizarse a través del cuaderno. Su load_session puede estar al comienzo del cuaderno. Y dump_session puede estar al final del cuaderno.
MetalloyD
27

(Prefiero comentar que ofrecer esto como una respuesta real, pero necesito más reputación para comentar).

Puede almacenar la mayoría de las variables similares a datos de forma sistemática. Lo que suelo hacer es almacenar todos los marcos de datos, matrices, etc. en pandas.HDFStore . Al comienzo del cuaderno, declare

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

y luego almacenar las nuevas variables a medida que las produzca

backup['var1'] = var1

Al final, probablemente sea una buena idea hacer

backup.close()

antes de apagar el servidor. La próxima vez que desee continuar con el cuaderno:

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

A decir verdad, también preferiría la funcionalidad incorporada en el portátil ipython. No puede guardar todo de esta manera (por ejemplo, objetos, conexiones) y es difícil mantener el cuaderno organizado con tantos códigos estándar.

Anh Huynh
fuente
5
Esta es una solución muy interesante, pero literalmente puedo sentir el dolor asociado con el mantenimiento de dicho sistema. Gracias por el consejo aunque :)
Robin Nemeth
19

Esta pregunta está relacionada con: ¿Cómo almacenar en caché en IPython Notebook?

Para guardar los resultados de las celdas individuales, la magia del almacenamiento en caché es útil.

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

Al volver a ejecutar el cuaderno, el contenido de esta celda se carga desde la caché.

Esto no responde exactamente a su pregunta, pero podría ser suficiente cuando los resultados de todos los largos cálculos se recuperen rápidamente. Esto, en combinación con presionar el botón de ejecutar todo en la parte superior del portátil, es para mí una solución viable.

La magia de la caché todavía no puede salvar el estado de todo un portátil . Que yo sepa, todavía no existe ningún otro sistema para reanudar un "cuaderno". Esto requeriría guardar todo el historial del kernel de Python. Después de cargar el portátil y conectarse a un kernel, se debe cargar esta información.

Vasco
fuente