【问题标题】:ipython notebook and leaking file descriptorsipython 笔记本和泄漏的文件描述符
【发布时间】:2014-03-15 02:27:49
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    这并不是真正的答案,而是一些解决方法,以防其他人发现自己在这里遇到文件描述符泄漏问题。

    第一个可能更好的解决方法是使用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 会抱怨“无法保存历史”之类的东西(大概我已经破坏了它正在使用的东西),但它在其他方面工作得很好。

    【讨论】:

      猜你喜欢
      • 2015-09-23
      • 1970-01-01
      • 2011-01-15
      • 2014-09-20
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多