我有一个非常简单的设置,如下所示:
while True:
model.fit(mySeqGen(xx), ..., use_multiprocessing=True, workers=8)
<stuff>
model.save_weights(fname)
gc.collect()
它运行很长时间,但如果过夜,我会发现它在每个循环迭代中都会生成OSError: [Errno 24] Too many open files
。完整堆栈跟踪在另一台机器上,但它有多个对多处理的引用。
这肯定与实际的文件无关,而是在引擎盖下创建的线程未正确清理的副产品。有没有一种简单的方法可以让这个循环在长时间内保持稳定,并在每次传球后清理干净?
这可能是系统限制。
输入以下命令:
$ ulimit -n
一千二十四
结果是1024,这意味着系统被限制为同时打开1024个文件。
修改方式:
减少线程数量以满足此限制(仅方法(。
增加此限制。
a。Ulimit-N 2048(此方法暂时修改,当前有效。退出后恢复原始设置(
b。修改以下文件
sudo-vim/etc/security/limits。conf
软文件2048
硬盘文件2048
保存后重新启动。
*无限制
数据段长度:ulimit - D unlimited
最大内存大小:ulimit - M unlimited
堆栈大小:ulimit - s unlimited
您可以监控进程打开的线程、连接和文件的数量:
import psutil
p = psutil.Process()
while True:
model.fit(mySeqGen(xx), ..., use_multiprocessing=True, workers=8)
<stuff>
model.save_weights(fname)
gc.collect()
print(f'files={len(p.open_files())} conn={len(p.connections(kind='tcp'))} threads={p.num_threads()}')
至少你会知道该解决什么问题。