时间:2020-10-29 11:19:32 | 栏目:Python代码 | 点击:次
最近在使用 Python notebook时老是出现python崩溃的现象,如下图,诱发的原因是“KERNELBASE.dll”,异常代码报“40000015”。
折腾半天,发现我启动notebook时是用自定义startup.bat方式方式启动的,bat文件的内容为
start C:\Anaconda3\python.exe "C:/Anaconda3/Scripts/jupyter-notebook-script.py"
平时双击这个bat文件就行了,如果报这个莫名的错误,是因为权限不对,需要用管理员方式运行,如图,问题解决!
补充知识:jupyter notebook占用内存空间过大打不开的解决办法(包括但不限于爬虫造成的)
jupyter notebook由于超过内存限制而“锁死”的解决
这两天用爬虫爬数据的时候由于print了大量的爬取内容,让notebook内存溢出停止运行,连带着localhost:8888也崩溃了。Google Chrome的处理机制应该是杀掉内存溢出的页面,所以localhost:8888刷新一下就恢复了。
但是!我的code找不回来了!不知道是什么机制,在文件里看到的大小只有不到45MB,但是一旦从localhost:8888里面打开,(用任务管理器看的)Chrome占用的内存就远远超过这个数字,一直飙升到3GB的时候再次弹出来内存不足的提示,同时页面被杀掉。用pycharm尝试更是失败,比Chrome还吃内存。
在经历了各种尝试,上网搜了也没有发现相关情况之后,自己偶然发现了解决办法:
如何打开源文件:
在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, “metadata”: {}, “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 }