2013-08-16 8 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 
$ 

मैं अब भी वही त्रुटि हो रही है। पीएस: मैंने भी अपनी प्रणाली को पुनरारंभ किया और कार्यक्रम चलाया लेकिन बिना किसी सफलता के।

+1

फ़ाइलों की एक crapload है के बजाय कोशिश करनी चाहिए। क्या आपको वास्तव में एक ही समय में उन्हें सभी खुले रखने की ज़रूरत है? – user2357112

+3

मैं अत्यधिक सुझाव देता हूं कि आप कुछ प्रकार की कतार प्रणाली विकसित करें ताकि सभी फाइल हैंडल खुले नहीं रहें, जो अत्यधिक अक्षम है। – enginefree

+0

चूंकि इनपुट फ़ाइल बहुत बड़ी है, इसलिए मैं इसे केवल एक बार पढ़ना चाहता हूं। इसके अलावा यदि एकाधिक फाइलें खोलना पाइथन द्वारा समर्थित है तो इसका उपयोग क्यों न करें। इसने मेरे जीवन को तब तक आसान बना दिया जब तक खुली फाइलों की संख्या 256 से कम थी। – learner

उत्तर

0

एक न्यूनतम कामकाजी उदाहरण अच्छा होगा। मुझे मैक 10.6.8 पर पाइथन 3.3.2, जीसीसी 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() 
10

"बहुत अधिक फ़ाइलें खुली" त्रुटियों हमेशा मुश्किल कर रहे हैं - आप केवल ulimit साथ ज़ुल्फ़ करने की जरूरत नहीं है, लेकिन आप भी प्रणाली विस्तृत सीमा और OSX-विशेष जांच करने के लिए किया है। This SO post gives more information on open files in OSX. (स्पोइलर चेतावनी: डिफ़ॉल्ट 256 है)।

हालांकि, एक ही समय में खोलने वाली फ़ाइलों की संख्या को सीमित करना अक्सर आसान होता है। अगर हम स्टीफन 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)) 
संबंधित मुद्दे