在上一篇博客中我提到,我在使用多线程+协程爬虫抓取数据的时候,当我的协程数×线程数非常大的时候,会提示[Error 24: too many open files]和其他一系列错误。这篇博客就是专门针对这个问题的解决方案,亲测可行。
为什么会报这个错误呢?明明只打开了几个文件啊?
这应该是绝大多数人的第一反应。我当时遇到这个错误的时候也很懵,后来想了想,应该是我每一个协程都获取了访问这个文件的句柄,所以尽管你只把爬取的数据保存到一个文件中,但是程序运行时,可能有很多线程或进程都拥有这个文件的句柄,在程序看来就像打开了很多个文件。
因此针对这种情况唯一的方法就是更改系统默认的最大文件数量。
ubuntu下,可以在终端输入 ulimit -n
来查看当前系统默认的最大文件数量,一般默认为1024.显然,这个值对于爬虫来说比较小了。
有两种修改此默认值的方法。两种方法分别在不同的机器上成功过,第一种简单,但不保证能够成功,如果第一种失败的话,尝试第二种,基本上能够解决问题。
第一种方法:
直接在终端输入: ulimit -n 10000
我在我自己的电脑上试了这种都没有成功,只在服务器上成功过。
第二种方法:
在终端输入sudo vim /etc/security/limits.conf
打开文件后,到文件末尾,敲击键盘i开始插入内容:
* soft nofile 10000
* hard nofile 10000
将上面两行写入完毕后,按Esc键,退出编辑模式,然后同时按shift和;键,输入wq!
保存文件并退出。然后注销重新登陆。此时在在终端输入ulimit -n
得到的结果就是刚刚设置的值了。这个值其实可以设的再大一点,目前我只设置到了20000.
windows下还没有试过,最近很少登windows了,windows不知道会不会有这样的问题,如果遇到了的话,原理应该是一样的,按照这个思路去找答案应该就可以解决。
以上。欢迎交流。