jupyter notebook 使用過(guò)程中python莫名崩潰的原因及解決方式
最近在使用 Python notebook時(shí)老是出現(xiàn)python崩潰的現(xiàn)象,如下圖,誘發(fā)的原因是“KERNELBASE.dll”,異常代碼報(bào)“40000015”。
折騰半天,發(fā)現(xiàn)我啟動(dòng)notebook時(shí)是用自定義startup.bat方式方式啟動(dòng)的,bat文件的內(nèi)容為
start C:Anaconda3python.exe 'C:/Anaconda3/Scripts/jupyter-notebook-script.py'
平時(shí)雙擊這個(gè)bat文件就行了,如果報(bào)這個(gè)莫名的錯(cuò)誤,是因?yàn)闄?quán)限不對(duì),需要用管理員方式運(yùn)行,如圖,問(wèn)題解決!
補(bǔ)充知識(shí):jupyter notebook占用內(nèi)存空間過(guò)大打不開(kāi)的解決辦法(包括但不限于爬蟲(chóng)造成的)
jupyter notebook由于超過(guò)內(nèi)存限制而“鎖死”的解決這兩天用爬蟲(chóng)爬數(shù)據(jù)的時(shí)候由于print了大量的爬取內(nèi)容,讓notebook內(nèi)存溢出停止運(yùn)行,連帶著localhost:8888也崩潰了。Google Chrome的處理機(jī)制應(yīng)該是殺掉內(nèi)存溢出的頁(yè)面,所以localhost:8888刷新一下就恢復(fù)了。
但是!我的code找不回來(lái)了!不知道是什么機(jī)制,在文件里看到的大小只有不到45MB,但是一旦從localhost:8888里面打開(kāi),(用任務(wù)管理器看的)Chrome占用的內(nèi)存就遠(yuǎn)遠(yuǎn)超過(guò)這個(gè)數(shù)字,一直飆升到3GB的時(shí)候再次彈出來(lái)內(nèi)存不足的提示,同時(shí)頁(yè)面被殺掉。用pycharm嘗試更是失敗,比Chrome還吃?xún)?nèi)存。
在經(jīng)歷了各種嘗試,上網(wǎng)搜了也沒(méi)有發(fā)現(xiàn)相關(guān)情況之后,自己偶然發(fā)現(xiàn)了解決辦法:
如何打開(kāi)源文件:
在ipynb文件的地方選擇打開(kāi)方式,用Chrome瀏覽器打開(kāi),頁(yè)面的觀感類(lèi)似于網(wǎng)頁(yè)源碼,內(nèi)容是json格式的。
我能想到的幾種解決辦法:
第一種是笨辦法(核心思想:只要能夠打開(kāi)源文件就可以把需要的東西復(fù)制下來(lái)),把重要的代碼復(fù)制出來(lái),比如到txt文件里面,再把格式用的一些字符去掉,如果代碼量不是很多可以這樣做;
這是一定能成功的辦法,就是麻煩了一些,就不多說(shuō)了。
第二種是重新構(gòu)造一個(gè)json文件(核心思想:既然我已經(jīng)知道ipynb本質(zhì)是json就可以仿造構(gòu)建一個(gè)可以打開(kāi)的ipynb),導(dǎo)致問(wèn)題的只是一個(gè)block,所以把有問(wèn)題的block之外的所有block信息復(fù)制到一個(gè)txt文件,再重命名成ipynb,用jupyter notebook解析出來(lái)即可(甚至還可以直接繼續(xù)運(yùn)行);
實(shí)際可行性:我是用的第二種辦法,實(shí)測(cè)可行,簡(jiǎn)單快捷。要注意的是一定要把最末尾的ipynb格式信息復(fù)制上。知道ipynb構(gòu)造之后,覺(jué)得自己也能寫(xiě)個(gè)網(wǎng)頁(yè)打開(kāi)ipynb的程序了(大誤)
第三種思想是用Python直接讀取ipynb文件,然后小心地把重要代碼和結(jié)果還原。(核心思想:不管后綴名是什么,只要里面是json格式就可以用Python的json包load),這種方法一定要注意的一點(diǎn)是,要觀察好json文件里面的構(gòu)造,不要全部print!不要全部print!之前怎么死的還不長(zhǎng)記性嗎?只要一print之前內(nèi)存溢出的block就全部玩兒完,就又有了一個(gè)被鎖死的ipynb文件。
理論可行性:文件本身的大小只有幾十MB,輕輕松松就能存下,內(nèi)存溢出可能是因?yàn)閜rint的內(nèi)容在網(wǎng)頁(yè)中占用的資源成倍增加。我沒(méi)有嘗試這么做,因?yàn)殡S時(shí)需要存檔備份,小心臟受不了。
看到這兒基本上問(wèn)題就應(yīng)該解決了,下面補(bǔ)充一點(diǎn)問(wèn)題來(lái)源和教訓(xùn)
前因后果:為什么會(huì)內(nèi)存溢出
這是一個(gè)“雄心勃勃”的爬蟲(chóng),要爬的東西很多,所以會(huì)長(zhǎng)時(shí)間運(yùn)行。由于微博的反爬做的很好,我不確定什么時(shí)候會(huì)被屏蔽,同時(shí)需要debug嘛,所以就隔一段時(shí)間print爬到的網(wǎng)頁(yè)。另外為了觀察進(jìn)度還用了tqdm(非常好用,墻裂推薦),是為print的另一部分內(nèi)容。時(shí)間積累了很久(大概兩天多)就卡崩潰了。
經(jīng)驗(yàn)教訓(xùn):
1、執(zhí)行正式文件的時(shí)候還是最好備份一下,這次出問(wèn)題我的結(jié)果是保存在文件里面的,是code打不開(kāi)了,由于是孤本所以還是有點(diǎn)慌的(主要是跟微博斗智斗勇那么多天不想再搞了)
2、可以試著在文件里面寫(xiě)入日志,簡(jiǎn)單的就print也沒(méi)關(guān)系,這種長(zhǎng)時(shí)間運(yùn)行的程序還是需要考慮周全一點(diǎn)
附一個(gè)ipynb文件源文件格式示例:
內(nèi)容是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,“metadata”: {},“outputs”: [],“source”: []}],“metadata”: {“kernelspec”: {“display_name”: “Python 3”,“l(fā)anguage”: “python”,“name”: “python3”},“l(fā)anguage_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 使用過(guò)程中python莫名崩潰的原因及解決方式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. .NET中l(wèi)ambda表達(dá)式合并問(wèn)題及解決方法2. JSP數(shù)據(jù)交互實(shí)現(xiàn)過(guò)程解析3. 淺談python出錯(cuò)時(shí)traceback的解讀4. 利用promise及參數(shù)解構(gòu)封裝ajax請(qǐng)求的方法5. Python importlib動(dòng)態(tài)導(dǎo)入模塊實(shí)現(xiàn)代碼6. python matplotlib:plt.scatter() 大小和顏色參數(shù)詳解7. windows服務(wù)器使用IIS時(shí)thinkphp搜索中文無(wú)效問(wèn)題8. ASP 信息提示函數(shù)并作返回或者轉(zhuǎn)向9. 在Android中使用WebSocket實(shí)現(xiàn)消息通信的方法詳解10. Nginx+php配置文件及原理解析
