วิธีการดองหรือจัดเก็บเซสชันสมุดบันทึก Jupyter (IPython) ไว้ใช้ในภายหลัง


104

สมมติว่าฉันกำลังทำการวิเคราะห์ข้อมูลขนาดใหญ่ขึ้นในสมุดบันทึก Jupyter / Ipython ซึ่งมีการคำนวณที่ใช้เวลานานมาก จากนั้นด้วยเหตุผลบางประการฉันต้องปิดเซิร์ฟเวอร์ภายในเครื่อง jupyter แต่ฉันต้องการกลับไปทำการวิเคราะห์ในภายหลังโดยไม่ต้องผ่านการคำนวณที่ใช้เวลานานทั้งหมดอีกครั้ง


สิ่งที่ผมจะชอบความรักที่จะทำคือการpickleหรือเก็บเซสชั่น Jupyter ทั้งหมด (หมีแพนด้าทุก dataframes, np.arrays ตัวแปร, ... ) ดังนั้นฉันสามารถปิดเซิร์ฟเวอร์รู้ฉันสามารถกลับไปเซสชั่นของฉันในตรงรัฐเดียวกับ ก่อน.

เป็นไปได้ในทางเทคนิคหรือไม่? มีฟังก์ชันในตัวที่ฉันมองข้ามไปหรือไม่?


แก้ไข:จากคำตอบนี้มี%store เวทมนตร์ที่ควรจะเป็น "ผักดองน้ำหนักเบา" อย่างไรก็ตามคุณต้องจัดเก็บตัวแปรด้วยตนเองดังนี้:

#inside a ipython/nb session
foo = "A dummy string"
%store foo
ปิดการมองเห็นรีสตาร์ทเคอร์เนล
%store -r foo # r เพื่อรีเฟรช
print(foo) # "A dummy string"

ซึ่งค่อนข้างใกล้เคียงกับสิ่งที่ฉันต้องการ แต่การต้องทำด้วยตนเองและไม่สามารถแยกความแตกต่างระหว่างเซสชันต่างๆทำให้มีประโยชน์น้อยลง


1
มีความคืบหน้าเกี่ยวกับเรื่องนี้หรือไม่? ฉันสังเกตเห็นว่ามีพื้นที่ทำงานใน Spyder IDE ที่สามารถบันทึกตัวแปรลงใน * .mat ได้ แต่ไม่แน่ใจว่าสามารถพอร์ตเข้า Jupyter Notebook ได้หรือเปล่า
cqcn1991

คุณพิจารณาpypi.python.org/pypi/dillหรือยัง "dill ยังให้ความสามารถในการ: - บันทึกและโหลดเซสชันล่าม python" นั่นคือ python แต่ไม่แน่ใจว่ามีอะไรเกี่ยวข้องกับ ipython หรือเคอร์เนล
piccolbo

คำตอบ:


66

ฉันคิดว่า Dill ตอบคำถามของคุณได้ดี

pip install dill

บันทึกเซสชันสมุดบันทึก:

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

คืนค่าเซสชันสมุดบันทึก:

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

ที่มา


1
ล้มเหลวเมื่อมีเครื่องกำเนิดไฟฟ้า (ซึ่งเป็นเรื่องที่สมเหตุสมผลเมื่อฉันคิดเกี่ยวกับเรื่องนี้) แต่ดูเหมือนว่าสิ่งนี้จะใกล้เคียงที่สุดที่เราสามารถหวังได้!
Robin Nemeth

1
ทำงานได้ดีสำหรับฉัน สิ่งที่ควรคำนึงถึงสองประการ: อันดับแรกหากคุณมีวัตถุเชื่อมต่อ pyodbc ห้อยอยู่คุณจะต้องปิดและตั้งค่าทั้งหมดเป็นไม่มีมิฉะนั้นคุณจะได้รับข้อผิดพลาด "TypeError: can't pickle pyodbc.Connection objects" . ประการที่สองสถานะของสมุดบันทึกไม่มีกราฟที่สร้างขึ้นโดยรหัสของคุณดังนั้นคุณจะต้องเรียกใช้เซลล์อีกครั้งเพื่อนำกลับมา
Michael Szczepaniak

แต่ไม่ได้ผลฉันใช้ไฟล์ที่บันทึกไว้ในเครื่องอื่น
Jaya A

ติดตั้งผักชีลาว ฉันจะนำเข้า dill dill.dump_session ('notebook_env.db') จากบรรทัดคำสั่งหรือไม่
cheznead

ไม่ต้องทำในขณะที่ใช้งานสมุดบันทึก Jupyter ทั้ง dump_session และ load_session ควรผ่านโน้ตบุ๊ก load_session ของคุณสามารถอยู่ที่จุดเริ่มต้นของโน้ตบุ๊ก และ dump_session สามารถอยู่ที่ส่วนท้ายสุดของสมุดบันทึก
MetalloyD

28

(ฉันอยากแสดงความคิดเห็นมากกว่าที่จะเสนอสิ่งนี้เป็นคำตอบจริง แต่ฉันต้องการชื่อเสียงมากกว่านี้เพื่อแสดงความคิดเห็น)

คุณสามารถจัดเก็บตัวแปรที่คล้ายข้อมูลส่วนใหญ่ได้อย่างเป็นระบบ สิ่งที่ฉันมักจะทำคือเก็บ dataframes ทั้งหมดอาร์เรย์ ฯลฯ ในpandas.HDFStore ที่จุดเริ่มต้นของสมุดบันทึกให้ประกาศ

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

แล้วจัดเก็บตัวแปรใหม่เมื่อคุณสร้างตัวแปร

backup['var1'] = var1

ในตอนท้ายอาจเป็นความคิดที่ดีที่จะทำ

backup.close()

ก่อนปิดเซิร์ฟเวอร์ ครั้งต่อไปที่คุณต้องการดำเนินการต่อกับสมุดบันทึก:

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

บอกความจริงฉันต้องการฟังก์ชั่นในตัวในโน้ตบุ๊ก ipython ด้วย คุณไม่สามารถบันทึกทุกอย่างด้วยวิธีนี้ (เช่นวัตถุการเชื่อมต่อ) และเป็นการยากที่จะจัดระเบียบโน้ตบุ๊กด้วยรหัสสำเร็จรูปจำนวนมาก


6
นี่เป็นวิธีแก้ปัญหาที่น่าสนใจมาก แต่ฉันรู้สึกได้ถึงความเจ็บปวดที่เกี่ยวข้องกับการรักษาระบบดังกล่าว ขอบคุณสำหรับคำแนะนำ :)
Robin Nemeth

19

คำถามนี้เกี่ยวข้องกับ: วิธีการแคชใน IPython Notebook?

ในการบันทึกผลลัพธ์ของแต่ละเซลล์เวทมนตร์การแคชมีประโยชน์

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

เมื่อเรียกใช้โน้ตบุ๊กใหม่เนื้อหาของเซลล์นี้จะถูกโหลดจากแคช

นี่ไม่ได้ตอบคำถามของคุณอย่างตรงไปตรงมา แต่อาจเพียงพอที่จะกู้คืนผลลัพธ์ของการคำนวณที่มีความยาวทั้งหมดได้อย่างรวดเร็ว การรวมกันของการกดปุ่มรันทั้งหมดที่ด้านบนของโน้ตบุ๊กเป็นวิธีแก้ปัญหาสำหรับฉัน

มายากลแคชไม่สามารถบันทึกสถานะของโน๊ตบุ๊คทั้งยัง สำหรับความรู้ของฉันยังไม่มีระบบอื่นใดที่จะใช้ "สมุดบันทึก" ต่อได้ สิ่งนี้จะต้องบันทึกประวัติทั้งหมดของเคอร์เนล python หลังจากโหลดโน้ตบุ๊กและเชื่อมต่อกับเคอร์เนลข้อมูลนี้ควรโหลด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.