आपकी मेमोरी के उपयोग को बाधित करने के लिए दो दृष्टिकोण हैं: पूर्व पोस्ट फैक्टो, और प्रीमेप्टिव। यह कहना है, आप अपने कार्यक्रम को मारने की कोशिश कर सकते हैं क्योंकि यह बहुत बड़ा हो गया है, या आप इसे पहली बार में बहुत बड़ा नहीं होने के लिए प्रोग्राम कर सकते हैं।
यदि आप पूर्व पोस्ट वास्तविक दृष्टिकोण पर जोर देते हैं, तो आप निम्नलिखित बैश स्क्रिप्ट का उपयोग कर सकते हैं। यह स्क्रिप्ट पहले मेमोरी की मात्रा ("रेजिडेंट सेट साइज" के रूप में परिभाषित करती है) प्रोसीड पीआईडी के साथ प्रक्रिया का उपयोग करती है, सभी गैर संख्यात्मक डेटा को grep का उपयोग करके फ़िल्टर करती है, और इस राशि को वेरिएबल n के रूप में सहेजती है। स्क्रिप्ट तब जांचती है कि क्या n आपके निर्दिष्ट x से अधिक है। यदि यह है, तो प्रोसेसिड पिड के साथ प्रक्रिया को मार दिया जाता है।
कृपया ध्यान दें:
- आपको
<pid>
अपने प्रोग्राम के प्रोसेस आईडी से बदलना होगा ।
- आपको
<x>
rss = "निवासी सेट आकार" (यानी वास्तविक मेमोरी आकार) से बदलना होगा जो आप प्रोग्राम को पार नहीं करना चाहते हैं।
n=$(ps -<pid> -o rss | grep '[0-9]')
if [ $n -gt <x> ]; then kill -9 <pid>; fi
यदि आप चाहते हैं कि यह प्रत्येक y सेकंड को चलाने के लिए है, तो इसे लूप में सम्मिलित करें, और इसे प्रत्येक पुनरावृत्ति के बाद y सेकंड के लिए प्रतीक्षा करने के लिए कहें। आप एक समान कमांड का उपयोग करके भी लिख सकते हैं top
। आपका शुरुआती बिंदु होगा top -l 1|grep "<pid>"|awk '{print $10}'
।
@ kenorb के जवाब से मुझे अपनी स्क्रिप्ट में मदद मिली
जबकि मेरा मानना है कि प्रश्न का उत्तर देता है, लंबे समय में मेरा मानना है कि मैन्युअल मेमोरी आवंटन का उपयोग करते हुए प्रीमेप्टिव दृष्टिकोण लेना बेहतर प्रोग्रामिंग डिज़ाइन है।
सबसे पहले, क्या आप सुनिश्चित हैं कि मेमोरी का उपयोग वास्तव में एक समस्या है? गो प्रलेखन में कहा गया है:
गो मेमोरी एलोकेटर आवंटन के लिए एक क्षेत्र के रूप में वर्चुअल मेमोरी के एक बड़े क्षेत्र को आरक्षित करता है। यह वर्चुअल मेमोरी विशिष्ट गो प्रक्रिया के लिए स्थानीय है; आरक्षण स्मृति की अन्य प्रक्रियाओं से वंचित नहीं करता है।
यदि आपको अभी भी लगता है कि आपको कोई समस्या है, तो मैं आपको अपनी मेमोरी को मैन्युअल रूप से प्रबंधित करने के लिए प्रोत्साहित करता हूं जैसा कि सी प्रोग्रामिंग भाषा में किया गया है। चूंकि गो सी में लिखा है, मुझे संदेह है कि सी मेमोरी प्रबंधन / आवंटन में आने के तरीके होंगे, और वास्तव में वहाँ हैं। इस जीथूब भंडार को देखें ,
आपको अपने सिस्टम के लिए मानक सी एलोकेटर के माध्यम से मैनुअल मेमोरी प्रबंधन करने की अनुमति देता है। यह मॉलॉक, कॉलोक और शीर्ष पर एक पतली आवरण है। अपने सिस्टम के लिए इन कार्यों के विवरण के लिए मैन मालॉक देखें। यह पुस्तकालय cgo का उपयोग करता है।
उपयोग का मामला इस प्रकार है:
आप ऐसा क्यों चाहेंगे?
जब कोई प्रोग्राम मेमोरी प्रेशर पैदा कर रहा होता है या सिस्टम मेमोरी से बाहर चल रहा होता है तो यह मेमोरी एलोकेशन और डीलक्लोशन्स को मैन्युअल रूप से कंट्रोल करने में मददगार हो सकता है। गो आपको आवंटन को नियंत्रित करने में मदद कर सकते हैं लेकिन अनावश्यक डेटा को स्पष्ट रूप से डील करना संभव नहीं है।
यह एक बेहतर दीर्घकालिक समाधान की तरह लगता है।
यदि आप C (स्मृति प्रबंधन सहित) के बारे में अधिक जानना चाहते हैं, तो
C प्रोग्रामिंग भाषा मानक संदर्भ है।