आर

2011-06-10 38 views
9

में मेमोरी उपयोग और कचरा संग्रह ट्रैकिंग ट्रैकिंग मैं उन कार्यों को चला रहा हूं जो गहराई से घोंसले हुए हैं और विंडोज़ टास्क मैनेजर द्वारा रिपोर्ट की गई स्मृति का काफी उपभोग करते हैं। आउटपुट वैरिएबल अपेक्षाकृत छोटे होते हैं (उपभोग की मात्रा की तुलना में परिमाण के 1-2 ऑर्डर छोटे होते हैं), इसलिए मुझे लगता है कि अंतर को फ़ंक्शन में कहीं भी इंटरमीडिएट वेरिएबल्स (या उप-फ़ंक्शंस कहा जा रहा है) के लिए जिम्मेदार ठहराया जा सकता है और कचरा संग्रह में देरी तो, मेरे प्रश्न हैं:आर

1) क्या मेरी धारणा सही है? क्यों या क्यों नहीं?

2) क्या इंटरमीडिएट चर निर्दिष्ट करने के बजाए अधिक गहराई से काम करने के लिए केवल घोंसले कॉल में कोई समझ है? क्या यह स्मृति उपयोग को कम करेगा?

3) मान लीजिए कि एक परिदृश्य जिसमें आर 4 जीबी रैम वाली प्रणाली पर 3 जीबी मेमोरी का उपयोग कर रहा है। जीसी() चलाने के बाद, अब यह केवल 2 जीबी का उपयोग कर रहा है। ऐसी परिस्थिति में, क्या आर कचरा संग्रह चलाने के लिए पर्याप्त स्मार्ट है, अगर मैंने कहा कि एक और समारोह कहा जाता है जो 1.5 जीबी मेमोरी का इस्तेमाल करता है?

ऐसे कुछ डेटासेट हैं जिनके साथ मैं काम कर रहा हूं, जो सिस्टम को क्रैश करने में सक्षम हैं क्योंकि यह संसाधित होने पर स्मृति से बाहर हो जाता है, और मैं इसे कम करने की कोशिश कर रहा हूं। किसी भी जवाब के लिए अग्रिम धन्यवाद!

जोश

उत्तर

6

1) स्मृति में वस्तुओं का प्रतिनिधित्व करने के लिए उपयोग की जाने वाली मेमोरी और ओएस द्वारा चिह्नित स्मृति को कई परतों से अलग किया जाता है (आर की अपनी मेमोरी हैंडलिंग, ओएस कब और कैसे अनुप्रयोगों से स्मृति को पुनः प्राप्त करता है)। मैं कहूंगा (ए) मुझे निश्चित रूप से पता नहीं है लेकिन (बी) कभी-कभी कार्य प्रबंधक की मेमोरी उपयोग की धारणा आर द्वारा उपयोग की जाने वाली स्मृति को सटीक रूप से प्रतिबिंबित नहीं कर सकती है, लेकिन वह (सी) हां, शायद आप विसंगति वर्णन आपके वर्तमान सत्र में वस्तुओं को आर द्वारा आवंटित स्मृति को दर्शाता है।

2) एक समारोह में

तरह
f = function() { a = 1; g=function() a; g() } 

f() प्रिंट 1 लागू, a द्वारा प्रयोग किया जाता है कि स्मृति जिसका अर्थ अभी भी प्रयोग में के रूप में चिह्नित किया जा रहा है जब g शुरू हो जाती है। तो घोंसले के कार्यों मेमोरी प्रबंधन, शायद विपरीत के साथ मदद नहीं करता है।

आपकी सबसे अच्छी शर्त अधिक आवंटन करने से पहले बड़े आवंटन का प्रतिनिधित्व करने वाले चर को साफ़ या पुन: उपयोग करना है। उचित रूप से तैयार किया गया है कार्यों f रिटर्न

f = function() { m = matrix(0, 10000, 10000); 1 } 
g = function() { m = matrix(0, 10000, 10000); 1 } 
h = function() { f(); g() } 

f की बड़ी स्मृति नहीं रह गया है जब तक की जरूरत है, इस के साथ मदद कर सकते हैं जैसे, और इतना कचरा संग्रहण के लिए उपलब्ध है, तो बड़े g के लिए आवश्यक स्मृति इस आवश्यकता होती है।

3) यदि आर एक चर के लिए स्मृति आवंटित करने का प्रयास करता है और नहीं कर सकता है, तो यह अपने कचरा कलेक्टर को चलाएगा और पुनः प्रयास करेगा। इसलिए आपको gc() चलाकर कुछ भी प्राप्त नहीं होता है।

मैं यह सुनिश्चित करता हूं कि आपने मेमोरी कुशल कोड लिखा है, और यदि अभी भी समस्याएं हैं तो मैं 64 बिट प्लेटफॉर्म पर जाऊंगा जहां स्मृति किसी समस्या से कम है।

5

आर स्मृति रूपरेखा के लिए सुविधा नहीं है, लेकिन यह है कि निर्माण किया जाना चाहिए। हालांकि हम इसे डेबियन/उबंटू के लिए सक्षम करते हैं, मुझे नहीं पता कि विंडोज के लिए डिफ़ॉल्ट क्या है।

मेमोरी प्रोफाइलिंग का उपयोग 'लेखन आर एक्सटेंशन' मैनुअल में चर्चा की जाती है (संक्षेप में)।

32-बिट सिस्टम (और विशेष रूप से विंडोज़) पर (सीमित) मेमोरी के साथ मुकाबला करने में इसकी चुनौतियां हैं। अधिकांश लोग अनुशंसा करेंगे कि आप 64-बिट ओएस चलाने के जितना संभव हो उतना रैम वाला सिस्टम स्विच करें।