2010-02-22 16 views
45

मैं कभी-कभी पाइथन प्रोग्राम लिखता हूं जो यह निर्धारित करना बहुत कठिन होता है कि यह निष्पादन से पहले कितनी मेमोरी का उपयोग करेगा। इस प्रकार, मैं कभी-कभी एक पाइथन प्रोग्राम का आह्वान करता हूं जो भारी मात्रा में रैम आवंटित करने का प्रयास करता है जिससे कर्नेल भारी स्वैप कर देता है और अन्य चल रही प्रक्रियाओं के प्रदर्शन को कम कर देता है।ढेर आकार को सीमित करने के लिए कैसे?

इस वजह से, मैं इस बात को प्रतिबंधित करना चाहता हूं कि पाइथन ढेर कितनी मेमोरी बढ़ सकती है। जब सीमा तक पहुंच जाती है, तो प्रोग्राम बस क्रैश हो सकता है। ऐसा करने का सबसे अच्छा तरीका क्या है?

यदि यह महत्वपूर्ण है, तो साइथन में बहुत अधिक कोड लिखा गया है, इसलिए इसे वहां आवंटित स्मृति मेमोरी लेनी चाहिए। मैं शुद्ध पायथन समाधान से शादी नहीं कर रहा हूं (इसे पोर्टेबल होने की आवश्यकता नहीं है), इसलिए लिनक्स पर काम करने वाली कोई भी चीज़ ठीक है।

+4

मैं इस प्रश्न के बारे में उलझन में हूं। ऐसा लगता है कि एक उत्तर शामिल है लेकिन यह इंगित नहीं करता कि इसमें क्या गलत है। – amcnabb

+0

ऐसा लगता है कि उसने स्वीकार किए गए उत्तर के कोड को अपने प्रश्न में कॉपी किया है। संभवतः यह समाधान है? – fantabolous

+0

@amcnabb मैंने प्रश्न से उत्तर हटा दिया – Djizeus

उत्तर

45

resource.setrlimit() देखें। यह केवल यूनिक्स सिस्टम पर काम करता है लेकिन ऐसा लगता है कि यह वही हो सकता है जो आप खोज रहे हैं, क्योंकि आप अपनी प्रक्रिया के लिए अधिकतम ढेर आकार और संसाधन के साथ अपनी प्रक्रिया के बच्चों का चयन कर सकते हैं। BRIMIT_DATA पैरामीटर।

संपादित करें: एक उदाहरण जोड़ना:

import resource 

rsrc = resource.RLIMIT_DATA 
soft, hard = resource.getrlimit(rsrc) 
print 'Soft limit starts as :', soft 

resource.setrlimit(rsrc, (1024, hard)) #limit to one kilobyte 

soft, hard = resource.getrlimit(rsrc) 
print 'Soft limit changed to :', soft 

मुझे यकीन है कि क्या आपके उपयोग के मामले ठीक है नहीं कर रहा हूँ लेकिन यह संभव आप resouce.RLIMIT_STACK साथ बजाय ढेर के आकार की सीमा रखना आवश्यक है। इस सीमा से आगे जाने से आपकी प्रक्रिया में एक SIGSEGV सिग्नल भेजा जाएगा, और इसे संभालने के लिए आपको एक वैकल्पिक सिग्नल स्टैक को नियत करने की आवश्यकता होगी जैसा कि सेट्रलिट लिनक्स manpage में वर्णित है। मुझे यकीन नहीं है कि अगर सिग्ल्टस्टैक पाइथन में लागू किया गया है, हालांकि, यदि आप इस सीमा पर जाने से ठीक होना चाहते हैं तो यह साबित हो सकता है।

+3

क्या आप एक उदाहरण दे सकते हैं? मैंने विभिन्न संसाधनों की स्थापना करने की कोशिश की, लेकिन मैं अभी भी एक गीगाबाइट सूची आवंटित करने में सक्षम था। संसाधन मॉड्यूल "सही लगता है", लेकिन मैं इसे लिनक्स पर काम नहीं कर सकता। – carl

+0

मैंने प्रश्न में अपना परीक्षण जोड़ा। मेरी समझ यह है कि सीमा तक पहुंचने के बाद पायथन प्रोग्राम छोड़ना चाहिए। – carl

+2

इसके अलावा, मुझे परवाह नहीं है कि क्या सीमा होती है यदि सीमा तक पहुंच जाती है - प्रोग्राम क्रैश, लटका, या जो भी हो, तब तक जब तक यह अधिक स्मृति आवंटित नहीं करता है। – carl

0

ulimit पर एक नज़र डालें। यह संसाधन कोटा सेट करने की अनुमति देता है। उचित कर्नेल सेटिंग्स की भी आवश्यकता हो सकती है।

+0

जब आप पीएएम का उपयोग कर रहे हैं, तो '/ etc/security/limit.conf' सीमा निर्धारित करने के लिए बेहतर जगह है। 'ulimit' केवल एक बैश खोल समारोह है। –

+0

ulimit पाइथन संसाधन मॉड्यूल के रूप में एक ही सिस्टम कॉल का उपयोग करता है – Willem

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