ipython笔记本和泄漏的文件描述符

时间:2014-03-15 02:27:49

标签: sockets ipython-notebook file-descriptor resource-leak

我在ipython笔记本中运行的代码中泄漏文件描述符时出现问题。我正在使用urllib2下载大量文件并在本地保存它们。显然,urllib2有泄漏文件描述符的历史,我怀疑这会引起问题。最后,我得到了IoError: Too many open files

作为一种解决方法,我会定期使用os.close关闭一堆套接字。不幸的是,ipython notebook有很多套接字在运行,我不想关闭。

有没有办法可以识别哪些文件描述符/套接字/等等属于ipython

1 个答案:

答案 0 :(得分:0)

这不是一个真正的答案,但有一些解决方法,以防其他人发现自己泄漏了文件描述符问题。

第一个可能更好的解决方法是使用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()(我也检查名称 - 描述符本身会被回收)。 / p>

这很难看,有时候ipython笔记本会抱怨“无法保存历史记录”(大概我已经破坏了它正在使用的东西),但它的效果还不错。