python中打开的文件太多
我编写了一个文件密集型的测试套件。一段时间后(2h),我得到一个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):
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说原稿有什么问题会更有帮助。并不是每个人都想玩“发现差异”的游戏。说出原作的错误会更有帮助。不是每个人都想玩“发现差异”。