So beizen oder speichern Sie Jupyter (IPython) -Notizbuchsitzungen für später

98

Angenommen, ich mache eine größere Datenanalyse in Jupyter / Ipython-Notebooks mit vielen zeitaufwändigen Berechnungen. Dann muss ich aus irgendeinem Grund den lokalen Jupyter-Server I herunterfahren, aber ich möchte später zur Analyse zurückkehren, ohne alle zeitaufwändigen Berechnungen erneut durchführen zu müssen.


Was würde ich mag die Liebe zu tun , pickleoder die ganze Jupyter Sitzung speichern (all Pandas Datenrahmen, np.arrays, Variablen, ...) , so kann ich abschalten sicher den Server weiß , dass ich genau meine Session zurückkehren kann in dem gleichen Zustand wie Vor.

Ist es überhaupt technisch möglich? Gibt es eine integrierte Funktionalität, die ich übersehen habe?


EDIT: Basierend auf dieser Antwort gibt es eine %store Magie, die "leichte Gurke" sein sollte. Sie müssen die Variablen jedoch wie folgt manuell speichern:

#inside a ipython/nb session
foo = "A dummy string"
%store foo
Seesion schließen, Kernel
%store -r foo # r zur Aktualisierung neu starten
print(foo) # "A dummy string"

Das ist ziemlich nah an dem, was ich möchte, aber wenn ich es manuell machen muss und nicht zwischen verschiedenen Sitzungen unterscheiden kann, ist es weniger nützlich.

Robin Nemeth
quelle
1
Irgendwelche Fortschritte in diesem Bereich? Mir ist nur aufgefallen, dass es in Spyder IDE einen Arbeitsbereich gibt, in dem Variablen in * .mat gespeichert werden können. Aber nicht sicher, ob dies in Jupyter Notebook portiert werden könnte.
cqcn1991
Haben Sie über pypi.python.org/pypi/dill nachgedacht ? "Dill bietet auch die Möglichkeit: - Python-Interpreter-Sitzungen zu speichern und zu laden" Das ist Python, nicht sicher, was noch mit Ipython oder einem Kernel zu
tun hat

Antworten:

63

Ich denke, Dill beantwortet Ihre Frage gut.

pip install dill

Speichern Sie eine Notebook-Sitzung:

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

Wiederherstellen einer Notebook-Sitzung:

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

Quelle

MetalloyD
quelle
1
scheitert, wenn es Generatoren gibt (was macht Sinn, wenn ich darüber nachdenke), aber es scheint, dass dies so nah ist, wie wir hoffen können!
Robin Nemeth
1
Hat super für mich funktioniert. Beachten Sie Folgendes: Wenn Pyodbc-Verbindungsobjekte herumhängen, müssen Sie sie schließen und dann alle auf Keine setzen. Andernfalls wird der Fehler "TypeError: Pyodbc.Connection-Objekte können nicht ausgewählt werden" angezeigt . Zweitens enthält der Notizbuchstatus keine Diagramme, die von Ihrem Code generiert wurden. Daher müssen Sie die Zellen erneut ausführen, um diese wiederherzustellen.
Michael Szczepaniak
Aber es funktioniert nicht Ich habe die gespeicherte Datei auf einem anderen Computer verwendet
Jaya A
27

(Ich würde dies lieber kommentieren als als tatsächliche Antwort anbieten, aber ich brauche mehr Ruf, um Kommentare abzugeben.)

Sie können die meisten datenähnlichen Variablen systematisch speichern. Normalerweise speichere ich alle Datenrahmen, Arrays usw. in pandas.HDFStore . Erklären Sie am Anfang des Notizbuchs

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

und speichern Sie dann alle neuen Variablen, während Sie sie erstellen

backup['var1'] = var1

Am Ende wahrscheinlich eine gute Idee

backup.close()

bevor Sie den Server ausschalten. Wenn Sie das nächste Mal mit dem Notizbuch fortfahren möchten:

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

Um ehrlich zu sein, ich würde die integrierte Funktionalität auch in ipython notebook bevorzugen. Auf diese Weise können Sie nicht alles speichern (z. B. Objekte, Verbindungen), und es ist schwierig, das Notebook mit so vielen Boilerplate-Codes zu organisieren.

Anh Huynh
quelle
5
Dies ist eine sehr interessante Problemumgehung, aber ich kann buchstäblich den Schmerz spüren, der mit der Aufrechterhaltung eines solchen Systems verbunden ist. Danke für den Tipp tho :)
Robin Nemeth
19

Diese Frage bezieht sich auf: Wie wird in IPython Notebook zwischengespeichert?

Um die Ergebnisse einzelner Zellen zu speichern, ist die Caching-Magie praktisch.

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

Beim erneuten Ausführen des Notizbuchs wird der Inhalt dieser Zelle aus dem Cache geladen.

Dies beantwortet Ihre Frage nicht genau, reicht jedoch möglicherweise aus, wenn die Ergebnisse aller langwierigen Berechnungen schnell wiederhergestellt werden. Dies ist in Kombination mit dem Drücken der Run-All-Taste oben auf dem Notebook für mich eine praktikable Lösung.

Die Cache-Magie kann den Status eines ganzen Notizbuchs noch nicht speichern . Meines Wissens gibt es noch kein anderes System, um ein "Notizbuch" wieder aufzunehmen. Dies würde erfordern, den gesamten Verlauf des Python-Kernels zu speichern. Nach dem Laden des Notebooks und dem Herstellen einer Verbindung zu einem Kernel sollten diese Informationen geladen werden.

Vasco
quelle