49

我有一个巨大的文件,要写入大约 450 个文件。我收到错误消息too many files open。我在网上搜索并找到了一些解决方案,但没有帮助。

import resource
resource.setrlimit(resource.RLIMIT_NOFILE, (1000,-1))
>>> len(pureResponseNames) #Filenames 
434
>>> resource.getrlimit(resource.RLIMIT_NOFILE)
(1000, 9223372036854775807)
>>> output_files = [open(os.path.join(outpathDirTest, fname) + ".txt", "w") for fname in pureResponseNames]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 24] Too many open files: 'icd9_737.txt'
>>> 

ulimit我也从命令行更改如下:

$ ulimit -n 1200
$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1200
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited
$ 

我仍然遇到同样的错误。PS:我也重新启动了系统并运行了程序,但没有成功。

4

7 回答 7

23

“打开的文件太多”的错误总是很棘手——你不仅要玩弄 . ulimit,还必须检查系统范围的限制和 OSX 的细节。这篇 SO 帖子提供了有关 OSX 中打开文件的更多信息。(剧透警报:默认值为 256)。

但是,通常很容易限制必须同时打开的文件数量。如果我们看一下 Stefan Bollman 的示例,我们可以轻松地将其更改为:

pureResponseNames = ['f'+str(i) for i in range(434)]
outpathDirTest="testCase/"
output_files = [os.path.join(outpathDirTest, fname) + ".txt" for fname in pureResponseNames]

for filename in range(output_files):
    with open(filename, 'w') as f:
        f.write('This is a test of file nr.'+str(i))
于 2014-01-14T21:04:52.970 回答
16

你应该尝试$ ulimit -n 50000而不是1200.

于 2016-11-21T09:32:18.683 回答
9

如果由于某些原因无法关闭文件(例如,您正在使用 3rd 方模块),您可以考虑根据最大限制而不是预定义的硬编码限制进行设置(如果您尝试设置hard,它将抛出):ValueErrorhard+1

import resource
soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE)
resource.setrlimit(resource.RLIMIT_NOFILE, (hard, hard))

而且我想明确一点,即使您在 python 进程仍在运行时手动删除创建的文件,它仍然会在以后抛出这样的错误。

于 2018-08-05T13:36:13.200 回答
3

我将我的 ulimit 更改为4096from1024并且它有效。以下是程序:

使用以下命令检查您的描述符数量限制:

ulimit -n

对我来说,它是1024,我将它更新为4096并且它有效。

ulimit -n 4096
于 2021-11-29T06:23:00.497 回答
2

sudo vim /etc/security/limits.conf

添加

*         hard    nofile      500000
*         soft    nofile      500000

到文件。

于 2021-03-11T15:57:53.947 回答
1

我强烈建议您不要增加ulimit.

  1. 例如,您的数据库可能会增长很多,并导致生成比以前更多的文件,以至于它会变得大于您固定并认为足够的限制。
  2. 这是一项耗时/容易出错的维护任务,因为您必须确保每个环境/服务器都正确设置了该限制并且永远不会更改。

您应该确保与该语句open结合使用close或使用该with语句(这更符合 Pythonic)。

第三方库可能会给您带来问题(例如,pyPDF2在调用该方法PdfFileMerger.append之前会保持文件打开)。write我跟踪这个的方式非常难看,但是在监控打开文件数量的同时在服务器上尝试了几件事就成功了(我的本地开发计算机在 Mac OS X 下运行,服务器是 CentOs):

watch 'lsof | grep "something-created-filenames-have-in-common" | wc -l'
于 2019-09-02T12:24:47.667 回答
-2

一个最小的工作示例会很好。我在 mac 10.6.8 上使用以下脚本和 Python 3.3.2、GCC 4.2.1 得到了与 ron.rothman 相同的结果。你在使用它时会出错吗?

    import os, sys
    import resource
    resource.setrlimit(resource.RLIMIT_NOFILE, (1000,-1))
    pureResponseNames = ['f'+str(i) for i in range(434)]
    try:
        os.mkdir("testCase")
    except:
        print('Maybe the folder is already there.')
    outpathDirTest="testCase/"
    output_files = [open(os.path.join(outpathDirTest, fname) + ".txt", "w") for fname in pureResponseNames]
    for i in range(len(output_files)):
        output_files[i].write('This is a test of file nr.'+str(i))
        output_files[i].close()
于 2013-08-22T01:23:47.290 回答