我编写了简单的测试代码,可以在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'
答案 0 :(得分:31)
打开文件的数量受操作系统的限制。在linux上你可以输入
ulimit -n
看看有什么限制。如果您是root用户,则可以键入
ulimit -n 2048
现在你的程序运行正常(以root身份),因为你已经将限制提升到了2048个打开的文件
答案 1 :(得分:6)
很可能是因为操作系统对应用程序可以打开的文件数量有限制。
答案 2 :(得分:5)
运行代码时,我在Windows上看到了相同的行为。 C运行时存在限制。您可以使用win32file更改限制值:
import win32file
print win32file._getmaxstdio()
以上将给你512,这解释了#509的失败(+ stdin,stderr,stdout,正如其他人已经说过的那样)
执行以下操作,您的代码运行正常:
win32file._setmaxstdio(2048)
请注意,2048是硬限制(但是底层C Stdio的硬限制)。因此,对我来说,执行值大于2048的_setmaxstdio失败。
答案 3 :(得分:2)
要检查更改Linux上打开文件句柄的限制,您可以使用Python模块resource:
import resource
# the soft limit imposed by the current configuration
# the hard limit imposed by the operating system.
soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE)
print 'Soft limit is ', soft
# For the following line to run, you need to execute the Python script as root.
resource.setrlimit(resource.RLIMIT_NOFILE, (3000, hard))
在Windows上,我按照Punit S的建议:
import platform
if platform.system() == 'Windows':
import win32file
win32file._setmaxstdio(2048)
答案 4 :(得分:0)
由于这不是Python问题,请执行以下操作:
for x in xrange(2000):
with open('files/file_%d' % x, 'r') as h:
print h.read()
以下是非常糟糕的主意。
fps.append(h)
答案 5 :(得分:-1)
需要追加,以便垃圾收集器不会清理和关闭文件