为什么python对文件句柄的计数有限制?

为什么python对文件句柄的计数有限制?,python,Python,我编写了简单的测试代码,在python脚本中可以打开多少文件: for i in xrange(2000): fp = open('files/file_%d' % i, 'w') fp.write(str(i)) fp.close() fps = [] for x in xrange(2000): h = open('files/file_%d' % x, 'r') print h.read() fps.append(h) 我有个例外 IOE

我编写了简单的测试代码,在python脚本中可以打开多少文件:

for i in xrange(2000):
    fp = open('files/file_%d' % i, 'w')
    fp.write(str(i))
    fp.close()

fps = []
for x in xrange(2000):
    h = open('files/file_%d' % x, 'r')
    print h.read()
    fps.append(h)
我有个例外

IOError: [Errno 24] Too many open files: 'files/file_509'

很可能是因为操作系统对应用程序可以打开的文件数量有限制。

打开的文件数量受操作系统的限制。在linux上,您可以键入

ulimit -n
ulimit -n 2048
看看极限是多少。如果您是root用户,则可以键入

ulimit -n
ulimit -n 2048

现在,您的程序将以root用户身份正常运行,因为您已将打开文件的限制提高到2048个

既然这不是Python的问题,请执行以下操作:

for x in xrange(2000):
    with open('files/file_%d' % x, 'r') as h:
        print h.read()
以下是一个非常糟糕的主意

fps.append(h)

附加是必需的,这样垃圾收集器就不会清理和关闭文件

我在运行代码时在Windows上看到了相同的行为。该限制存在于C运行时。您可以使用win32file更改限制值:

import win32file

print win32file._getmaxstdio()
上面给出了512,这就解释了#509处的故障(+stdin、stderr、stdout,其他人已经说过)

执行以下操作,您的代码将正常运行:

win32file._setmaxstdio(2048)

请注意,2048是硬限制(基础C Stdio的硬限制)。因此,对我来说,执行值大于2048的_setmaxstdio失败。

要检查更改Linux上打开文件句柄的限制,可以使用Python模块:

在Windows上,我按照Punit的建议:

import platform

if platform.system() == 'Windows':
    import win32file
    win32file._setmaxstdio(2048)

在Fedora14和Python2.7上,我在1021@wiso,+stdin,stdout,stderr等于1024-我以前在哪里见过这个数字?你应该使用
try..finally
with
来安全地关闭文件。对于你的问题:也许你想告诉我们你要做什么,因为你的代码对我来说毫无意义。@gnibber:
ulimit-n
给我1024。我认为您还需要将
/usr/lib64/python2.7/atexit.py
/home/xyz/.pystartup
计算为打开的文件。如果您在同一操作系统上用另一种语言尝试,您会很快发现这不是Python的限制。+1,如果您想使用python代码检查限制,我将添加使用
导入资源;print resource.getrlimit(resource.RLIMIT_NOFILE)
。显然,您不需要成为root用户就可以更改它(我刚刚尝试过!)。这是否是个坏主意取决于您正在做什么。就连Guido自己也在一个特定的排序算法中使用了这种保留打开文件的策略:@S.Lott:你能解释一下为什么你认为fps.append(h)是个坏主意吗(你会建议哪种选择)?我注意到我不必是root用户就可以在Ubuntu中运行
setrlimit
,我首先要做这个安装:
pip安装pywin32