我在 ipython 笔记本中运行的代码中存在泄漏文件描述符的问题。我正在下载大量文件urllib2
并将它们保存在本地。显然,urllib2
有泄漏文件描述符的历史,我怀疑这会导致问题。最后,我得到一个IoError: Too many open files
.
作为一种解决方法,我定期使用os.close
. 不幸的是,ipython notebook
有很多我不想关闭的套接字正在运行。
有没有一种方法可以识别哪些文件描述符/套接字/等 .. 属于ipython
?
我在 ipython 笔记本中运行的代码中存在泄漏文件描述符的问题。我正在下载大量文件urllib2
并将它们保存在本地。显然,urllib2
有泄漏文件描述符的历史,我怀疑这会导致问题。最后,我得到一个IoError: Too many open files
.
作为一种解决方法,我定期使用os.close
. 不幸的是,ipython notebook
有很多我不想关闭的套接字正在运行。
有没有一种方法可以识别哪些文件描述符/套接字/等 .. 属于ipython
?
这并不是一个真正的答案,而是一些解决方法,以防其他人发现自己在这里遇到文件描述符泄漏问题。
第一个解决方法,可能更好,是用来subprocess.call()
下载我想要的文件wget
。它的速度大约是以下方法的 4 倍。
第二种解决方法是使用我在 SO 上找到的几个方便的功能(我目前找不到 - 如果你找到它,请编辑它或让我知道,我会链接):
import resource
import fcntl
import os
def get_open_fds():
fds = []
soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE)
for fd in range(0, soft):
try:
flags = fcntl.fcntl(fd, fcntl.F_GETFD)
except IOError:
continue
fds.append(fd)
return fds
def get_file_names_from_file_number(fds):
names = []
for fd in fds:
names.append(os.readlink('/proc/self/fd/%d' % fd))
return names
有了这些,我在开始下载文件之前存储了活动的文件描述符和相应的名称。然后我会定期测试打开的文件描述符的数量,如果它变得非常大,请使用os.close()
所有不在原始列表中的描述符(我也检查名称 - 描述符本身会被回收)。
它很丑陋,有时 ipython notebook 会抱怨“无法保存历史”之类的东西(大概我已经破坏了它正在使用的东西),但它在其他方面工作得很好。