2013-07-31 10 views
6

से स्मृति आवंटित नहीं किया जा सकता है मैंने इस मुद्दे पर कई समान पोस्ट पढ़ी हैं लेकिन कोई भी मेरी मदद करने के लिए प्रतीत नहीं होता है। यदि यह वास्तव में एक डुप्लिकेट पोस्ट है, तो कृपया मुझे समाधान युक्त थ्रेड पर निर्देशित करें!OSError: [Errno 12] python subprocess.call

मैं छवियों का एक समूह सहेज रहा हूं और फिर subprocess.call के साथ ffmpeg को कॉल कर रहा हूं। मैं अलग-अलग छवियों के संग्रह के लिए इसे कई बार करता हूं। यह मूल रूप से मैं कर रहा हूं:

from subprocess import call 
for video in videos: 
    call(['ffmpeg', ..., '-i', video, video+'.mp4')]) 

अलगाव में यह ठीक काम करता है। हालांकि, जब मेरे पास इन कॉल से पहले कुछ अन्य प्रसंस्करण भी किया जाता है (लूप के भीतर नहीं, शब्दशः केवल लूप शुरू होने से पहले स्मृति में मूल्य धारण करते हैं), यह कई वीडियो बनाने के बाद स्मृति त्रुटि के साथ दुर्घटनाग्रस्त हो जाता है (वास्तव में आखिरी बार बनाते समय एक)। this comment के अनुसार, subprocess.call फोर्क्स/वर्तमान प्रक्रिया को क्लोन करता है, जिसका अर्थ यह है कि यह स्मृति आवंटन का अनुरोध करता है कि वर्तमान में स्मृति में कितना है, जो कि ffmpeg को कॉल करने के लिए मैं क्या करना चाहता हूं।

मैं अजगर की अनावश्यक मात्रा आवंटित किए बिना पाइथन के भीतर ffmpeg कैसे कॉल कर सकता हूं?

उत्तर

3

हालांकि यह सच है कि subprocess.call प्रक्रिया को फोर्क करता है, और इस बच्चे की प्रक्रिया में अपनी मेमोरी स्पेस होती है जो प्रारंभ में मूल प्रक्रिया (आपके पायथन प्रोग्राम) के समान होती है, आधुनिक ऑपरेटिंग सिस्टम copy-on-write memory का उपयोग करेंगे। फोर्कड प्रक्रिया की मेमोरी ओवरहेड शुरू में अपेक्षाकृत छोटी है, केवल कर्नेल में प्रोसेस एकाउंटिंग के लिए कुछ केबी मेमोरी की आवश्यकता होती है। यह तब तक नहीं है जब तक कि बाल प्रक्रिया अपनी स्मृति में बदलाव नहीं कर लेती है, अतिरिक्त स्मृति की आवश्यकता होती है।

फोर्किंग के बाद, subprocess.call द्वारा उत्पन्न की गई बाल प्रक्रिया निष्पादन प्रणाली कॉल में से एक को कॉल करेगी, जो स्मृति में ffmpeg लोड करती है और इसे निष्पादित करना प्रारंभ करती है।

इसके अलावा, कांटा आमतौर पर केवल तंत्र एक POSIX प्रणाली (see here) पर एक नई प्रक्रिया बनाने के लिए है, तो मैं वहाँ कांटा-से-कार्यकारी अनुक्रम कि औजार subprocess.call के लिए एक विकल्प है नहीं लगता।

आप strace या Valgrind के माध्यम से अपना प्रोग्राम चलाने का प्रयास कर सकते हैं ताकि यह देखने के लिए कि सिस्टम कॉल को किस मेमोरी को अनुरोध नहीं किया जा रहा है। यह आपकी स्मृति आवश्यकताओं को कम करने के तरीके को निर्धारित करने में आपकी सहायता कर सकता है।

+0

उत्तर यहाँ consice और स्पष्ट है: उपप्रक्रिया कांटे की प्रक्रिया और स्मृति बढ़ा सकते हैं। यहां एक अधिक शामिल एसओ क्यू एंड ए है जो मदद भी कर सकता है: http://stackoverflow.com/questions/1367373/python-subprocess-popen-oserror-errno-12-cannot-allocate-memory उन लोगों को अधिक जानकारी दें जिनके पास यह समस्या है – Paul

2

मैं आज एक ही मुद्दा था और मैं सिर्फ ओएस का उपयोग करके इसे चारों ओर से काम किया:

import os 
for video in videos: 
    job = ' ffmpeg ' + ... + ' -i ' + video + '.mp4' 
    os.system(job) 
संबंधित मुद्दे