python中打开的文件太多

python中打开的文件太多,python,file-descriptor,Python,File Descriptor,我编写了一个文件密集型的测试套件。一段时间后(2h),我得到一个IOError:[Errno 24]太多打开的文件:'/tmp/tmpxsqYPm'。我仔细检查了所有文件句柄是否再次关闭它们。但错误仍然存在 我尝试使用resource.RLIMIT_NOFILE计算允许的文件描述符的数量以及当前打开的文件描述符的数量: def get_open_fds(): fds = [] for fd in range(3,resource.RLIMIT_NOFILE):

我编写了一个文件密集型的测试套件。一段时间后(2h),我得到一个
IOError:[Errno 24]太多打开的文件:'/tmp/tmpxsqYPm'
。我仔细检查了所有文件句柄是否再次关闭它们。但错误仍然存在

我尝试使用
resource.RLIMIT_NOFILE
计算允许的文件描述符的数量以及当前打开的文件描述符的数量:

def get_open_fds():

    fds = []
    for fd in range(3,resource.RLIMIT_NOFILE):
            try:
                    flags = fcntl.fcntl(fd, fcntl.F_GETFD)
            except IOError:
                    continue

            fds.append(fd)

    return fds
因此,如果我运行以下测试:

print get_open_fds()
for i in range(0,100):
    f = open("/tmp/test_%i" % i, "w")
    f.write("test")
    print get_open_fds()
我得到这个输出:

[]
/tmp/test_0
[3]
/tmp/test_1
[4]
/tmp/test_2
[3]
/tmp/test_3
[4]
/tmp/test_4
[3]
/tmp/test_5
[4] ...
这很奇怪,我以为打开的文件描述符会越来越多。我的脚本正确吗

我正在使用python的记录器和子进程。这可能是我fd泄漏的原因吗

谢谢,
Daniel

您的测试脚本会在每次迭代中覆盖
f
,这意味着每次都会关闭文件。记录到文件和带有管道的
子流程都会使用描述符,这可能会导致耗尽。

您的测试脚本会在每次迭代中覆盖
f
,这意味着每次都会关闭文件。记录到文件和带有管道的
子进程都会使用描述符,这会导致耗尽资源。

resource.RLIMIT_NOFILE实际上是7,但这是resource.getrlimit()的索引,而不是限制本身。。。resource.getrlimit(resource.RLIMIT_NOFILE)是您希望的top range()值

resource.RLIMIT_NOFILE实际上是7,但这是resource.getrlimit()的索引,而不是限制本身。。。resource.getrlimit(resource.RLIMIT_NOFILE)是您希望的top range()值

正确的代码是:

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

fds = get_open_fds()
print get_file_names_from_file_number(fds)
更正后的代码为:

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

fds = get_open_fds()
print get_file_names_from_file_number(fds)

请使用cat/proc/sys/fs/file max和cat/proc/sys/fs/file nr您应该使用
resource.getrlimit(resource.RLIMIT\u NOFILE)
resource.RLIMIT_NOFILE
只是一个访问信息的常量。subprocess.Popen会导致类似问题吗?似乎相关:请cat/proc/sys/fs/file max和cat/proc/sys/fs/file nr您应该使用
resource.getrlimit(resource.RLIMIT_NOFILE)
resource.RLIMIT_NOFILE
只是一个访问信息的常量。subprocess.Popen会导致类似问题吗?似乎相关:我的错,谢谢你的提示!get_open_fds()似乎起到了作用。但是resource.RLIMIT_NOFILE=7,我的错误发生在我打开1024个文件之后。无论如何,我知道如何调试我的脚本-到目前为止谢谢@线人你也能发布修复程序吗?我也有同样的问题,但不知道如何解决。我的错,谢谢你的提示!get_open_fds()似乎起到了作用。但是resource.RLIMIT_NOFILE=7,我的错误发生在我打开1024个文件之后。无论如何,我知道如何调试我的脚本-到目前为止谢谢@线人你也能发布修复程序吗?我也有同样的问题,但不知道如何解决。Thanx说原稿有什么问题会更有帮助。并不是每个人都想玩“发现差异”的游戏。说出原作的错误会更有帮助。不是每个人都想玩“发现差异”。