Come raccogliere o archiviare la sessione del notebook Jupyter (IPython) per dopo


100

Diciamo che sto eseguendo un'analisi dei dati più ampia nel notebook Jupyter / Ipython con molti calcoli che richiedono tempo. Quindi, per qualche motivo, devo chiudere il server locale jupyter I, ma vorrei tornare a fare l'analisi in un secondo momento, senza dover ripetere tutti i calcoli che richiedono tempo.


Quello che mi piace l'amore a fare è pickleo conservare l'intera sessione Jupyter (tutti i panda dataframes, np.arrays, variabili, ...) in modo da poter chiudere in modo sicuro il server sapere che posso tornare alla mia sessione esattamente nello stesso stato prima.

È anche tecnicamente possibile? C'è una funzionalità integrata che ho trascurato?


EDIT: in base a questa risposta c'è una %store magia che dovrebbe essere "sottaceto leggero". Tuttavia devi memorizzare le variabili manualmente in questo modo:

#inside a ipython/nb session
foo = "A dummy string"
%store foo
chiusura di sawion, riavvio del kernel
%store -r foo # r per l'aggiornamento
print(foo) # "A dummy string"

che è abbastanza vicino a quello che vorrei, ma doverlo fare manualmente e non essere in grado di distinguere tra sessioni diverse lo rende meno utile.


1
Qualche progresso su questo? Ho notato solo che c'è un'area di lavoro in Spyder IDE che può salvare le variabili in * .mat. Ma non sono sicuro che questo possa essere portato in Jupyter Notebook.
cqcn1991

Hai considerato pypi.python.org/pypi/dill ? "dill fornisce anche la capacità di: - salvare e caricare sessioni di interprete python" Questo è python, non sono sicuro di cos'altro è coinvolto con ipython o un kernel
piccolbo

Risposte:


64

Penso che Dill risponda bene alla tua domanda.

pip install dill

Salvare una sessione Notebook:

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

Ripristina una sessione di Notebook:

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

fonte


1
fallisce quando ci sono generatori (il che ha senso se ci penso), ma sembra che questo sia quanto di più vicino possiamo sperare!
Robin Nemeth

1
Ha funzionato alla grande per me. Un paio di cose da tenere a mente: Primo, se hai oggetti di connessione pyodbc in giro, dovrai chiuderli e poi impostarli tutti su Nessuno altrimenti, ottieni un errore "TypeError: can't pickle pyodbc.Connection objects" . In secondo luogo, lo stato del notebook non include i grafici che sono stati generati dal codice, quindi sarà necessario rieseguire le celle per ripristinarli.
Michael Szczepaniak,

Ma non funziona. Ho usato il file salvato su un'altra macchina
Jaya A

27

(Preferisco commentare piuttosto che offrire questo come una risposta effettiva, ma ho bisogno di più reputazione per commentare.)

È possibile memorizzare la maggior parte delle variabili simili a dati in modo sistematico. Quello che faccio di solito è memorizzare tutti i dataframe, gli array, ecc. In pandas.HDFStore . All'inizio del quaderno, dichiara

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

e quindi memorizzare tutte le nuove variabili man mano che vengono prodotte

backup['var1'] = var1

Alla fine, probabilmente una buona idea da fare

backup.close()

prima di spegnere il server. La prossima volta che desideri continuare con il notebook:

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

A dire il vero, preferirei anche la funzionalità integrata nel notebook ipython. Non è possibile salvare tutto in questo modo (ad esempio oggetti, connessioni) ed è difficile mantenere il notebook organizzato con così tanti codici standard.


5
Questa è una soluzione molto interessante, ma posso letteralmente sentire il dolore associato al mantenimento di tale sistema. Grazie per il suggerimento :)
Robin Nemeth

19

Questa domanda è correlata a: Come memorizzare nella cache in IPython Notebook?

Per salvare i risultati delle singole celle, la magia della cache è utile.

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

Quando si esegue nuovamente il blocco appunti, il contenuto di questa cella viene caricato dalla cache.

Questo non risponde esattamente alla tua domanda, ma potrebbe essere sufficiente quando i risultati di tutti i calcoli lunghi saranno recuperati rapidamente. Questo in combinazione con il premere il pulsante Esegui tutto in cima al notebook è per me una soluzione praticabile.

La magia della cache non può salvare lo stato di un intero quaderno ancora . A mia conoscenza non esiste ancora un altro sistema per riprendere un "quaderno". Ciò richiederebbe di salvare tutta la cronologia del kernel python. Dopo aver caricato il notebook e connesso a un kernel, queste informazioni dovrebbero essere caricate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.