前言:
当读者看到此博客时,大概率是Python遇到读取文件出现[Errno 24] Too many open files.我也小白,这是我在Tensorflow读取本地训练数据时出现的,看网上也有如爬虫等读取文件时产生的情况. 网上找了一些资料大致是说多线程读取文件太多,超出系统的限制.
但是解决方法,我找遍了博客资料都在说,这种情况多发生在linux系统下,给出的方法也是主要针对Linux的. 博客中对Linux系统解决方法如下:
Linux可以在终端输入 ulimit -n 来查看当前系统默认的最大文件数量,一般默认为1024(大批量操作文件时会不够).
第一种方法:
在终端输入: ulimit -n 10000
第二种方法:
在终端输入sudo vim /etc/security/limits.conf打开配置文件增加配置.滑动到文件末尾,敲击键盘i插入内容:
* soft nofile 10000
* hard nofile 10000
按Esc键,退出编辑模式,然后同时按shift和;键,输入wq!
保存文件并退出,重启系统,就把最大处理文件数改成10000了,其实你还可以放大(根据自身的情况改吧)
以上就是Linux系统下的解决方法,到此是网上大概率可以找到的资料,我找了一圈没有windows系统的方法,纳闷了,可能是笔者电脑性能差吧,才遇到这种情况.
那遇到了总要解决,解决思路我参照了上述的思想,首先系统配置数量看似也可行,但是不知道应该配置到哪里去?所以放弃了.再思考其他方法.没法配置,那在程序代码中控制文件打开和关闭总可以吧,按这个思路我在代码中,在每次循环打开文件的结尾,自觉的加了文件open处理执行完,每次都去关闭当前文件流,(这样似乎每次打开就关闭了吧),代码如下
for file in trainDataSets:
image_data = Image.open("D:\\ResearchModel\\datasets\\CatsDogs\\train_uniform\\"+file)
image_trains.append(image_data)
# 切分 将label标签信息抽离
labels = file.split(".")
if labels[0] == "cat":
image_labels.append(0)
elif labels[0] == "dog":
image_labels.append(1)
# 这部分就是我添加的,每个文件处理完之后再关闭,然后list循环中取下一张文件
image_data.close()
Tips:这样做,不知道 对性能是不是有很大影响,只是我读取文件是ok的了,也可以完整读取出所有的文件.(参照Linux思想是一次读取量放大,那我们就每次读取后关闭,我觉得思想是可以的,这种方法在Linux中感觉也可以使用,这样也不用去调配置了)
资料:
Linux下 : https://blog.csdn.net/qq_23926575/article/details/76619827