2013-08-16 32 views
21

Ich habe eine riesige Datei, die ich in etwa 450 Dateien schreibe. Ich bekomme einen Fehler als too many files open. Ich suchte im Internet und fand eine Lösung, aber es hilft nicht.IOError: [Errno 24] Zu viele offene Dateien:

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' 
>>> 

Ich habe auch ulimit von der Kommandozeile wie folgt:

$ 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 
$ 

ich immer noch die gleichen Fehler. PS: Ich habe auch mein System neu gestartet und das Programm ausgeführt, aber ohne Erfolg.

+1

Das ist ein crapload von Dateien ist. Müssen Sie wirklich alle zur selben Zeit geöffnet haben? – user2357112

+3

Ich schlage vor, dass Sie eine Art von Warteschlangensystem entwickeln, so dass all diese Dateizugriffe nicht offen bleiben, was sehr ineffizient ist. – enginefree

+0

Da die Eingabedatei sehr groß ist, möchte ich sie nur einmal lesen. Auch wenn das Öffnen mehrerer Dateien von Python unterstützt wird, warum sollte man es nicht benutzen. Es hat mein Leben viel einfacher gemacht, solange die Anzahl der geöffneten Dateien weniger als 256 betrug. – learner

Antwort

0

Ein minimales Arbeitsbeispiel wäre nett. Ich habe die gleichen Ergebnisse wie ron.rothman mit dem folgenden Skript mit Python 3.3.2, GCC 4.2.1 auf Mac 10.6.8. Erhalten Sie Fehler bei der Verwendung?

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

„Zu viele offenen Dateien“ Fehler sind immer schwierig - nicht nur mit ulimit drehen, aber Sie haben auch das System weite Grenzen und OSX-Spezifika zu überprüfen. This SO post gives more information on open files in OSX. (Spoileralarm: Der Standardwert ist 256).

Es ist jedoch oft einfach, die Anzahl der Dateien zu begrenzen, die gleichzeitig geöffnet sein müssen. Wenn wir bei Stefan Bollmann Vorbild betrachten, können wir leicht, das ändern:

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

sollten Sie versuchen, ulimit $ 50000 -n statt 1200

Verwandte Themen