Como conservar ou armazenar a sessão do notebook Jupyter (IPython) para mais tarde

100

Digamos que eu esteja fazendo uma análise de dados maior no notebook Jupyter / Ipython com muitos cálculos demorados feitos. Então, por algum motivo, eu tenho que desligar o servidor local jupyter I, mas gostaria de voltar a fazer a análise mais tarde, sem ter que passar por todos os cálculos demorados novamente.


O que eu gostaria amor fazer é pickleou armazenar toda a sessão Jupyter (todos os pandas dataframes, np.arrays, variáveis, ...) para que eu possa com segurança desligar o servidor saber que posso voltar para a minha sessão exatamente no mesmo estado em antes.

É mesmo tecnicamente possível? Há alguma funcionalidade interna que esqueci?


EDITAR: com base nesta resposta, há uma %store mágica que deveria ser "pickle leve". No entanto, você deve armazenar as variáveis ​​manualmente da seguinte forma:

#inside a ipython/nb session
foo = "A dummy string"
%store foo
fechando a sessão, reiniciando o kernel
%store -r foo # r para atualização
print(foo) # "A dummy string"

o que é bastante próximo do que eu gostaria, mas ter que fazer isso manualmente e ser incapaz de distinguir entre sessões diferentes torna-o menos útil.

Robin Nemeth
fonte
1
Algum progresso nisso? Eu só percebi que há um espaço de trabalho no IDE do Spyder que pode salvar variáveis ​​em * .mat. Mas não tenho certeza se isso pode ser portado para o Notebook Jupyter.
cqcn1991
Você já pensou em pypi.python.org/pypi/dill ? "dill também oferece a capacidade de: - salvar e carregar sessões de interpretador python" Isso é python, não tenho certeza do que mais está envolvido com ipython ou um kernel
piccolbo

Respostas:

64

Acho que Dill responde bem à sua pergunta.

pip install dill

Salvar uma sessão do Notebook:

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

Restaurar uma sessão do Notebook:

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

Fonte

MetalloyD
fonte
1
falha quando há geradores (o que faz sentido quando penso nisso), mas parece que é o mais próximo que podemos esperar!
Robin Nemeth
1
Funcionou muito bem para mim. Algumas coisas para manter em mente: primeiro, se você tiver objetos de conexão pyodbc pendurados, você precisará fechá-los e, em seguida, defini-los todos como None, caso contrário, você receberá um erro "TypeError: não é possível conservar objetos pyodbc.Connection" . Em segundo lugar, o estado do bloco de notas não inclui gráficos que foram gerados por seu código, portanto, você precisará executar novamente as células para trazê-los de volta.
Michael Szczepaniak
Mas não funciona, usei o arquivo salvo em outra máquina
Jaya A
27

(Prefiro comentar a oferecer isso como uma resposta real, mas preciso de mais reputação para comentar.)

Você pode armazenar a maioria das variáveis ​​semelhantes a dados de uma forma sistemática. O que geralmente faço é armazenar todos os dataframes, matrizes, etc. no pandas.HDFStore . No início do caderno, declare

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

e, em seguida, armazene quaisquer novas variáveis ​​conforme você as produz

backup['var1'] = var1

No final, provavelmente é uma boa ideia fazer

backup.close()

antes de desligar o servidor. Na próxima vez que você quiser continuar com o bloco de notas:

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

Verdade seja dita, eu também prefiro a funcionalidade integrada no notebook ipython. Você não pode salvar tudo desta forma (por exemplo, objetos, conexões), e é difícil manter o notebook organizado com tantos códigos clichê.

Anh Huynh
fonte
5
Esta é uma solução alternativa muito interessante, mas posso literalmente sentir a dor associada à manutenção desse sistema. Obrigado pela dica :)
Robin Nemeth
19

Esta questão está relacionada a: Como armazenar em cache no Notebook IPython?

Para salvar os resultados de células individuais, a mágica do cache é útil.

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

Ao executar novamente o bloco de notas, o conteúdo desta célula é carregado do cache.

Isso não é exatamente uma resposta à sua pergunta, mas pode ser o suficiente quando os resultados de todos os longos cálculos forem recuperados rapidamente. Esta combinação de apertar o botão run-all na parte superior do notebook é para mim uma solução viável.

A magia cache não pode salvar o estado de um caderno inteiro ainda . Pelo que sei, ainda não existe outro sistema para retomar um "notebook". Isso exigiria salvar todo o histórico do kernel do python. Após carregar o notebook e conectar a um kernel, esta informação deve ser carregada.

Vasco
fonte