2013-05-13 6 views
22

मैं किसी अन्य प्रोग्राम को कॉल करने के लिए सबप्रोसेस का उपयोग कर रहा हूं और इसके रिटर्न वैल्यू को एक चर में सहेज रहा हूं। इस प्रक्रिया को एक पाश में दोहराया है, और कुछ ही हजारों बार के बाद कार्यक्रम निम्नलिखित त्रुटि के साथ दुर्घटनाग्रस्त हो गया:पायथन सबप्रोसेस: बहुत अधिक खुली फ़ाइलें

Traceback (most recent call last): 
    File "./extract_pcgls.py", line 96, in <module> 
    SelfE.append(CalSelfEnergy(i)) 
    File "./extract_pcgls.py", line 59, in CalSelfEnergy 
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) 
    File "/usr/lib/python3.2/subprocess.py", line 745, in __init__ 
    restore_signals, start_new_session) 
    File "/usr/lib/python3.2/subprocess.py", line 1166, in _execute_child 
    errpipe_read, errpipe_write = _create_pipe() 
OSError: [Errno 24] Too many open files 

किसी भी विचार इस समस्या को हल करने के लिए कैसे बहुत सराहना कर रहा है!

कोड टिप्पणियों से आपूर्ति:

cmd = "enerCHARMM.pl -parram=x,xtop=topology_modified.rtf,xpar=lipid27_modified.par,nobuildall -out vdwaals {0}".format(cmtup[1]) 
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) 
out, err = p.communicate() 
+1

संचार() पाइप बंद कर देता है, इसलिए यह आपकी समस्या नहीं है। अंत में, Popen() केवल वह आदेश है जो आपके द्वारा पाइप से बाहर होने पर चलने के लिए होता है ... समस्या आपके कोड में कहीं और हो सकती है और अन्य फाइलें खुली रहती हैं। मैंने देखा "SelfE.append" ... क्या आप अन्य फाइलें खोल रहे हैं और उन्हें एक सूची में रखते हैं? – tdelaney

उत्तर

10

मुझे लगता है कि समस्या तथ्य के कारण था कि मैं प्रसंस्करण किया गया था सबप्रोसेस के साथ एक खुली फ़ाइल:

cmd = "enerCHARMM.pl -par param=x,xtop=topology_modified.rtf,xpar=lipid27_modified.par,nobuildall -out vdwaals {0}".format(cmtup[1]) 
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) 

यहां cmd ​​varia ब्ली में एक फ़ाइल का नाम होता है जिसे अभी बनाया गया है लेकिन बंद नहीं किया गया है। फिर subprocess.Popen उस फ़ाइल पर सिस्टम कमांड को कॉल करता है। इसे कई बार करने के बाद, प्रोग्राम उस त्रुटि संदेश से दुर्घटनाग्रस्त हो गया।

तो संदेश मैं इस से सीखा

Close the file you have created, then process it

धन्यवाद

3

आप ओएस के खुले फ़ाइल सीमा बढ़ाने का प्रयास कर सकते हैं:

ulimit -n 2048

+4

असल में वह आदेश '/ etc/security/limit.conf' में सेट किए गए ऊपर की सीमा को बढ़ाएगा नहीं। इसे बढ़ाने के लिए, आपको उस फ़ाइल में इन * * सॉफ्ट नोफाइल 4096'/'* हार्ड नोफाइल 4096' जैसी लाइनें रखने की आवश्यकता है (' 4096' को अपने मूल्य के साथ बदलें)। –

+1

कल इस समस्या में भाग लें, और मुझे '/ etc/security/limit.conf' दोनों को संपादित करना था और इस त्रुटि को दूर करने के लिए ubuntu में 'ulimit -n' के माध्यम से सीमा बढ़ाएं। –

0

उपप्रक्रिया में फ़ाइल को खोलता है। यह कॉल अवरुद्ध कर रहा है।

ss=subprocess.Popen(tempFileName,shell=True) 
ss.communicate() 
15

मैक OSX (एल कैप्टन) वर्तमान कॉन्फ़िगरेशन देखें में:

#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) 256 
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 

सेट खुली फ़ाइलों मूल्य 10K करने के लिए:

#ulimit -Sn 10000 

परिणाम की पुष्टि करें:

#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) 10000 
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 
4

Popen() द्वारा बनाई गई एक बाल प्रक्रिया माता-पिता से खुली फ़ाइल डिस्क्रिप्टर (एक सीमित संसाधन) का उत्तराधिकारी हो सकती है। POSIX (पाइथन 3.2 के बाद से डिफ़ॉल्ट) पर close_fds=True का उपयोग करें, इससे बचने के लिए। इसके अलावा, "PEP 0446 -- Make newly created file descriptors non-inheritable" deals with some remaining issues (since Python 3.4)

+0

मुझे नहीं लगता कि यह कम से कम सभी मामलों में काम करता है। मैंने 1024 ओपन फ़ाइल सीमा (उबंटू पर डिफॉल्ट) वाले सिस्टम पर 1200 नींद की प्रक्रिया वाली प्रक्रियाएं उत्पन्न कीं और यह close_fds = True के साथ भी उड़ा दी गई। तो मुझे लगता है कि उससे इसके लिए और भी कुछ है। चूंकि आपके पास अभी भी खुली प्रक्रियाओं में सीमा से अधिक है और यह केवल तभी काम करता है जब आप मानते हैं कि समस्या पूर्ण प्रक्रियाओं में निहित है जो खुले फ़ाइल डिस्क्रिप्टर को छोड़ देती है। – Sensei

+0

@SESEI यह काम करता है: माता-पिता में फ़ाइलें खोलें (सुनिश्चित करें कि एफडीएस विरासत योग्य हैं) तो 'close_fds = False'' के साथ उपप्रोसेन्स को बढ़ाएं (दोनों पुरानी पायथन संस्करणों पर डिफ़ॉल्ट हैं, लिंक का पालन करें)। देखें कि आपको कितनी जल्दी त्रुटि मिल जाएगी। स्पष्ट रूप से 'close_fds' सामान्य मामले में त्रुटि को रोक नहीं सकता है: इसे प्राप्त करने के लिए आपको एक नई प्रक्रिया को भी बढ़ाने की आवश्यकता नहीं है। – jfs

+0

सिवाय इसके कि यह नहीं है। मैं लूप के लिए एक साधारण भाग गया और ओएस सीमा को हिट करने के लिए पर्याप्त उपप्रोसेसर उत्पन्न किया। मैंने इसे close_fds = True के साथ किया था। इसका कोई प्रभाव नहीं पड़ा। मैं गलत क्यों हो सकता हूं लेकिन मेरा अनुमान यह है कि यह समाधान केवल तभी काम करता है जब आप कुछ उपप्रवाहों को जन्म दे रहे हों और वर्णनकर्ताओं को कभी भी साफ न करें। इस तरह के मामले में यह तर्क समझ में आता है लेकिन अगर आप वास्तव में उन प्रक्रियाओं को एक बार में चलाने और चलाने का इरादा रखते हैं तो मुझे यह काम नहीं दिख रहा है। – Sensei

2

दूसरों के रूप में उल्लेख किया है, /etc/security/limits.conf में सीमा को बढ़ा है और यह भी फाइल वर्णनकर्ता व्यक्तिगत रूप से मेरे लिए एक मुद्दा था, इसलिए मैं

sudo sysctl -w fs.file-max=100000 

किया और fs.file के साथ एक लाइन जोड़ा अधिकतम = 100000 (sysctl -p साथ पुनः लोड)

इसके अलावा, आप सुनिश्चित करें कि आपके प्रक्रिया कुछ और (जो मेरा था) से प्रभावित नहीं है बनाना चाहते हैं तो /etc/sysctl.conf करने के लिए, का उपयोग

cat /proc/{process id}/limits 

खोजने के लिए बाहर निकलें कि आपकी प्रक्रिया की वास्तविक सीमाएं क्या हैं, क्योंकि मेरे लिए पाइथन स्क्रिप्ट चलाने वाले सॉफ़्टवेयर की सीमाएं भी लागू होती हैं, जिसने सिस्टम की व्यापक सेटिंग्स को ओवरराइड किया है।

इस त्रुटि के साथ मेरे विशेष मुद्दे को हल करने के बाद यहां यह उत्तर पोस्ट करना और उम्मीद है कि यह किसी की सहायता करता है।

संबंधित मुद्दे