1. 程式人生 > 程式設計 >jupyter notebook 使用過程中python莫名崩潰的原因及解決方式

jupyter notebook 使用過程中python莫名崩潰的原因及解決方式

最近在使用 Python notebook時老是出現python崩潰的現象,如下圖,誘發的原因是“KERNELBASE.dll”,異常程式碼報“40000015”。

jupyter notebook 使用過程中python莫名崩潰的原因及解決方式

折騰半天,發現我啟動notebook時是用自定義startup.bat方式方式啟動的,bat檔案的內容為

start C:\Anaconda3\python.exe "C:/Anaconda3/Scripts/jupyter-notebook-script.py"

平時雙擊這個bat檔案就行了,如果報這個莫名的錯誤,是因為許可權不對,需要用管理員方式執行,如圖,問題解決!

jupyter notebook 使用過程中python莫名崩潰的原因及解決方式

補充知識:jupyter notebook佔用記憶體空間過大打不開的解決辦法(包括但不限於爬蟲造成的)

jupyter notebook由於超過記憶體限制而“鎖死”的解決
這兩天用爬蟲爬資料的時候由於print了大量的爬取內容,讓notebook記憶體溢位停止執行,連帶著localhost:8888也崩潰了。Google Chrome的處理機制應該是殺掉記憶體溢位的頁面,所以localhost:8888重新整理一下就恢復了。

jupyter notebook 使用過程中python莫名崩潰的原因及解決方式

但是!我的code找不回來了!不知道是什麼機制,在檔案裡看到的大小隻有不到45MB,但是一旦從localhost:8888裡面開啟,(用工作管理員看的)Chrome佔用的記憶體就遠遠超過這個數字,一直飆升到3GB的時候再次彈出來記憶體不足的提示,同時頁面被殺掉。用pycharm嘗試更是失敗,比Chrome還吃記憶體。

jupyter notebook 使用過程中python莫名崩潰的原因及解決方式

在經歷了各種嘗試,上網搜了也沒有發現相關情況之後,自己偶然發現瞭解決辦法:

如何開啟原始檔:

在ipynb檔案的地方選擇開啟方式,用Chrome瀏覽器開啟,頁面的觀感類似於網頁原始碼,內容是json格式的。

我能想到的幾種解決辦法:

第一種是笨辦法(核心思想:只要能夠開啟原始檔就可以把需要的東西複製下來),把重要的程式碼複製出來,比如到txt檔案裡面,再把格式用的一些字元去掉,如果程式碼量不是很多可以這樣做;

這是一定能成功的辦法,就是麻煩了一些,就不多說了。

第二種是重新構造一個json檔案(核心思想:既然我已經知道ipynb本質是json就可以仿造構建一個可以開啟的ipynb),導致問題的只是一個block,所以把有問題的block之外的所有block資訊複製到一個txt檔案,再重新命名成ipynb,用jupyter notebook解析出來即可(甚至還可以直接繼續執行);

實際可行性:我是用的第二種辦法,實測可行,簡單快捷。要注意的是一定要把最末尾的ipynb格式資訊複製上。知道ipynb構造之後,覺得自己也能寫個網頁開啟ipynb的程式了(大誤)

第三種思想是用Python直接讀取ipynb檔案,然後小心地把重要程式碼和結果還原。(核心思想:不管字尾名是什麼,只要裡面是json格式就可以用Python的json包load),這種方法一定要注意的一點是,要觀察好json檔案裡面的構造,不要全部print!不要全部print!之前怎麼死的還不長記性嗎?只要一print之前記憶體溢位的block就全部玩兒完,就又有了一個被鎖死的ipynb檔案。

理論可行性:檔案本身的大小隻有幾十MB,輕輕鬆鬆就能存下,記憶體溢位可能是因為print的內容在網頁中佔用的資源成倍增加。我沒有嘗試這麼做,因為隨時需要存檔備份,小心臟受不了。

看到這兒基本上問題就應該解決了,下面補充一點問題來源和教訓

前因後果:為什麼會記憶體溢位

這是一個“雄心勃勃”的爬蟲,要爬的東西很多,所以會長時間執行。由於微博的反爬做的很好,我不確定什麼時候會被遮蔽,同時需要debug嘛,所以就隔一段時間print爬到的網頁。另外為了觀察進度還用了tqdm(非常好用,牆裂推薦),是為print的另一部分內容。時間積累了很久(大概兩天多)就卡崩潰了。

經驗教訓:

1、執行正式檔案的時候還是最好備份一下,這次出問題我的結果是儲存在檔案裡面的,是code打不開了,由於是孤本所以還是有點慌的(主要是跟微博鬥智鬥勇那麼多天不想再搞了)

2、可以試著在檔案裡面寫入日誌,簡單的就print也沒關係,這種長時間執行的程式還是需要考慮周全一點

附一個ipynb檔案原始檔格式示例:

內容是hello world!

{
“cells”: [
{
“cell_type”: “code”,“execution_count”: 1,“metadata”: {},“outputs”: [
{
“name”: “stdout”,“output_type”: “stream”,“text”: [
“hello world!\n”
]
}
],“source”: [
“print(‘hello world!')”
]
},{
“cell_type”: “code”,“execution_count”: null,“outputs”: [],“source”: []
}
],“metadata”: {
“kernelspec”: {
“display_name”: “Python 3”,“language”: “python”,“name”: “python3”
},“language_info”: {
“codemirror_mode”: {
“name”: “ipython”,“version”: 3
},“file_extension”: “.py”,“mimetype”: “text/x-python”,“name”: “python”,“nbconvert_exporter”: “python”,“pygments_lexer”: “ipython3”,“version”: “3.7.3”
}
},“nbformat”: 4,“nbformat_minor”: 2
}

以上這篇jupyter notebook 使用過程中python莫名崩潰的原因及解決方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。