Jak marynować lub przechowywać sesję notatnika Jupyter (IPython) na później

103

Załóżmy, że wykonuję większą analizę danych w notebooku Jupyter / Ipython z wieloma czasochłonnymi obliczeniami. Następnie z jakiegoś powodu muszę wyłączyć lokalny serwer jupyter I, ale chciałbym wrócić do późniejszej analizy, bez konieczności ponownego wykonywania wszystkich czasochłonnych obliczeń.


Co bym jak miłość do zrobienia jest pickleani przechowywać całą sesję Jupyter (wszystkie pandy dataframes, np.arrays, zmienne, ...), więc mogę bezpiecznie wyłączyć serwer wiedząc, mogę powrócić do mojej sesji w dokładnie takim samym stanie, jak przed.

Czy jest to w ogóle technicznie możliwe? Czy jest jakaś wbudowana funkcja, którą przeoczyłem?


EDYCJA: w oparciu o odpowiedź istnieje %store magia, która powinna być „lekką marynatą”. Musisz jednak zapisywać zmienne ręcznie, w ten sposób:

#inside a ipython/nb session
foo = "A dummy string"
%store foo
zamykanie i ponowne uruchamianie jądra
%store -r foo # r w celu odświeżenia
print(foo) # "A dummy string"

co jest dość bliskie temu, czego bym chciał, ale konieczność robienia tego ręcznie i niemożność rozróżnienia między różnymi sesjami sprawia, że ​​jest mniej przydatna.

Robin Nemeth
źródło
1
Jakieś postępy w tej sprawie? Zauważyłem tylko, że w Spyder IDE jest obszar roboczy, który może zapisywać zmienne w * .mat. Ale nie jestem pewien, czy można to przenieść do notebooka Jupyter.
cqcn1991
Czy rozważałeś pypi.python.org/pypi/dill ? "dill zapewnia również możliwość: - zapisywania i ładowania sesji interpretera Pythona" To jest jednak python, nie wiem, co jeszcze jest związane z ipythonem lub jądrem
piccolbo Kwietnia

Odpowiedzi:

65

Myślę, że Dill dobrze odpowiedział na twoje pytanie.

pip install dill

Zapisz sesję Notatnika:

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

Przywróć sesję Notatnika:

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

Źródło

MetalloyD
źródło
1
zawodzi, gdy są generatory (co ma sens, kiedy o tym myślę), ale wydaje się, że jest tak blisko, na jaki możemy mieć nadzieję!
Robin Nemeth
1
U mnie zadziałało świetnie. Kilka rzeczy, o których należy pamiętać: Po pierwsze, jeśli masz wiszące w pobliżu obiekty połączenia pyodbc, musisz je zamknąć, a następnie ustawić je wszystkie na Brak, w przeciwnym razie pojawia się błąd „TypeError: cannot pickle pyodbc.Connection objects” . Po drugie, stan notatnika nie obejmuje wykresów, które zostały wygenerowane przez Twój kod, więc musisz ponownie uruchomić komórki, aby je przywrócić.
Michael Szczepaniak
Ale to nie działa Użyłem zapisanego pliku na innym komputerze
Jaya A
Zainstalowany koperek. Czy mam importować dill dill.dump_session ('notebook_env.db') z wiersza poleceń?
cheznead
Nie, musisz to zrobić podczas korzystania z notebooka Jupyter. Zarówno dump_session, jak i load_session powinny przechodzić przez notebook. Twoja load_session może znajdować się na początku notebooka. A dump_session może znajdować się na samym końcu notatnika.
MetalloyD
28

(Wolę to skomentować, niż zaoferować to jako rzeczywistą odpowiedź, ale potrzebuję więcej reputacji, aby skomentować.)

Większość zmiennych typu danych można przechowywać w systematyczny sposób. Zwykle przechowuję wszystkie ramki danych, tablice itp. W pandas.HDFStore . Na początku zeszytu zadeklaruj

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

a następnie zapisz wszystkie nowe zmienne w trakcie ich tworzenia

backup['var1'] = var1

Na koniec chyba dobry pomysł

backup.close()

przed wyłączeniem serwera. Następnym razem, gdy chcesz kontynuować korzystanie z notatnika:

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

Prawdę mówiąc, wolałbym również wbudowaną funkcjonalność w notebooku ipython. W ten sposób nie można zapisać wszystkiego (np. Obiektów, połączeń), a przy tak dużej liczbie standardowych kodów trudno jest utrzymać porządek w notatniku.

Anh Huynh
źródło
6
To bardzo ciekawe obejście, ale dosłownie odczuwam ból związany z utrzymaniem takiego systemu. Dzięki za cynk :)
Robin Nemeth
19

To pytanie jest związane z: Jak cache'ować w IPython Notebook?

Aby zapisać wyniki poszczególnych komórek, przydaje się magia buforowania .

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

Podczas ponownego uruchamiania notatnika zawartość tej komórki jest ładowana z pamięci podręcznej.

To nie jest dokładna odpowiedź na twoje pytanie, ale może wystarczyć, gdy wyniki wszystkich długich obliczeń zostaną szybko odzyskane. To w połączeniu z wciśnięciem przycisku „wszystko” na górze notebooka jest dla mnie praktycznym rozwiązaniem.

Pamięć podręczna magia nie może zapisać stan całego notebooka jeszcze . O ile mi wiadomo, nie ma jeszcze innego systemu, aby wznowić „notebook”. Wymagałoby to zapisania całej historii jądra Pythona. Po załadowaniu notatnika i podłączeniu do jądra, te informacje powinny zostać załadowane.

Vasco
źródło