2013-08-16 104 views
21

我有一個巨大的文件,我寫入大約450個文件。我得到的錯誤爲too many files open。我搜索了網絡,發現了一些解決方案,但沒有幫助。IOError:[Errno 24]太多打開的文件:

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:我也重新啓動了我的系統並運行該程序,但沒有成功。

+1

這是文件的crapload。你真的需要同時打開它們嗎? – user2357112

+3

我強烈建議你開發某種隊列系統,以便所有這些文件句柄都不會打開,這是非常低效的。 – enginefree

+0

由於輸入文件很大,我只想閱讀一次。另外,如果python支持打開多個文件,那麼爲什麼不使用它。只要打開文件的數量小於256,它使我的生活變得更輕鬆。 – learner

回答

0

一個最小的工作例子會很好。我得到了像ron.rothman一樣的結果,使用Python 3.3.2的以下腳本,在Mac 10.6.8上使用GCC 4.2.1。你有使用它的錯誤?

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() 
10

「打開的文件太多」錯誤始終是棘手 - 你不僅有ulimit來擺弄,但你也必須檢查系統範圍限制和OSX-細節。 This SO post gives more information on open files in OSX.(擾流板警報:默認值是256)。

但是,通常很容易限制必須同時打開的文件數量。如果我們看一下斯特凡·博爾曼的例子中,我們可以很容易地改變到:

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)) 
2

你應該嘗試$的ulimit -n 50000,而不是1200

相關問題