2009-09-23 16 views
57

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

क्या मुझे अधिकतम मेमोरी उपलब्धता सुनिश्चित करने के लिए बड़ी वस्तुओं को हटाने के बाद जीसी() चलाया जाना चाहिए?

उत्तर

38

"शायद।" मैं

cleanMem <- function(n=10) { for (i in 1:n) gc() } 

में के रूप में भी एक पाश में भी यह करना है, और अक्सर फिर भी है कि नहीं, मेरे अनुभव में, स्मृति एक प्राचीन राज्य को बहाल करता है।

तो मैं आमतौर पर स्क्रिप्ट फ़ाइलों में कार्यों को रखने और 'आर' फ्रंटेंड (यूनिक्स पर, और 'लिटलर पैकेज से) का उपयोग करके निष्पादित करना है। प्रतिलिपि उस अन्य ओएस पर एक विकल्प है।

कि कार्यप्रवाह

जो हम यहाँ से पहले कवर के साथ सहमत करने के लिए होता है।

+37

के साथ कॉल से पहले वर्चुअल मेमोरी (धीमी डिस्क एक्सेस के साथ) में फैलाने से बच सकता हूं, यह बार-बार 'gc()' चलाने में मदद क्यों करता है? – samhiggins2001

+0

। @ DirkEddelbuettel - क्यों 'gc()' बार-बार चलते हैं? –

6

"शायद।" मेरे पास वास्तव में एक निश्चित उत्तर नहीं है। लेकिन सहायता फ़ाइल से पता चलता है कि जीसी():

  1. पर कॉल करने के लिए वास्तव में केवल दो कारण हैं, आप स्मृति उपयोग की एक रिपोर्ट चाहते हैं।
  2. एक बड़ी वस्तु को हटाने के बाद, "यह आर को ऑपरेटिंग सिस्टम में स्मृति वापस करने के लिए संकेत दे सकता है।"

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

7

नहीं। यदि ऑपरेशन के लिए पर्याप्त मेमोरी उपलब्ध नहीं है, तो R 0 स्वचालित रूप से gc() चलाएगा।

+1

हमेशा मेरे अनुभव में स्वचालित रूप से नहीं होता है। यदि आप नियमित रूप से बड़े डेटा, जीसी() नियमित रूप से काम करते हैं या अपने आर सत्र को पुनरारंभ करते हैं। – Zach

+0

कृपया अपने कथन के लिए सबूत प्रदान करें। – hadley

+0

विंडोज 7 आर 2.12.1 – Zach

17

मदद पृष्ठ से gc पर:

'जीसी' की एक कॉल जगह लेने के लिए एक कचरा संग्रह का कारण बनता है। यह भी उपयोगकर्ता हस्तक्षेप के बिना स्वचालित रूप से हो जाएगा, और प्राथमिक 'gc' को कॉल करने का उद्देश्य स्मृति उपयोग पर रिपोर्ट के लिए है।

हालांकि, यह बाद एक बड़ी वस्तु हटा दिया गया है 'जीसी' कॉल करने के लिए उपयोगी हो सकता है, इस रूप में आर ऑपरेटिंग सिस्टम के लिए स्मृति वापस जाने के लिए संकेत दे सकता है।

तो यह करने के लिए उपयोगी हो सकता है, लेकिन ज्यादातर आप के लिए नहीं होना चाहिए।मेरी व्यक्तिगत राय यह है कि यह अंतिम उपाय का कोड है - आपको निश्चित रूप से gc() कथन के साथ अपना कोड कूड़ा नहीं जाना चाहिए, लेकिन यदि आपकी मशीन गिरती रहती है, और आपने बाकी सब कुछ करने की कोशिश की है, तो यह सहायक हो सकता है ।

सब कुछ करके, मैं नहीं बल्कि कच्चे स्क्रिप्ट से

  1. लेखन कार्यों तरह बातें मतलब है, तो चर क्षेत्र से बाहर चले जाते हैं।

  2. यदि आप एक समस्या से दूसरे असंबंधित में जाते हैं तो अपने कार्यक्षेत्र को खाली करना।

  3. डेटा/चर है कि आप में कोई दिलचस्पी नहीं कर रहे हैं को छोड़ने से (मैं अक्सर नीरस कॉलम के दर्जनों के साथ स्प्रेडशीट प्राप्त करते हैं।)

+3

मेरे कंप्यूटर में जीसी() कुछ मेमोरी रिलीज करता है लेकिन यह सही नहीं है। यदि मैं एक बड़ी वस्तु लोड करता हूं तो इसके साथ कुछ करता हूं, इसे हटाएं और जीसी() का उपयोग करें और मुझे शुरुआत में एक ही मुफ्त मेमोरी नहीं मिलती है। जितनी अधिक चीजें मैं अधिक मेमोरी करता हूं मैं पुनर्प्राप्त करने में असमर्थ हूं। अंत में, बड़े objetcs के साथ कई संचालन के बाद मैं स्मृति से बाहर चला सकते हैं। मैं विंडोज 10 x64 में हूं और मैं 16 जीबी रैम का उपयोग करता हूं। – skan

12

पार्टी के लिए देर से थोड़ा है, लेकिन:।

स्पष्ट रूप

कॉलिंग gc कुछ स्मृति "अब" मुक्त कर देगा। ... तो अगर अन्य प्रक्रियाओं स्मृति की आवश्यकता है, तो यह एक अच्छा विचार हो सकता है। उदाहरण के लिए system या इसी तरह से कॉल करने से पहले। या शायद जब आप स्क्रिप्ट के साथ "पूर्ण" होते हैं और आर अगली नौकरी आने तक थोड़ी देर तक निष्क्रिय रहेंगे - फिर, अन्य प्रक्रिया अधिक मेमोरी प्राप्त करें।

यदि आप बस अपनी स्क्रिप्ट को तेजी से चलाने के लिए चाहते हैं, तो इससे कोई फर्क नहीं पड़ता क्योंकि आर इसे बाद में कॉल करने की आवश्यकता होगी। यह धीमा भी हो सकता है क्योंकि सामान्य जीसी चक्र को इसे कॉल करने की आवश्यकता नहीं हो सकती है।

... लेकिन यदि आप उदाहरण के लिए समय मापना चाहते हैं, तो आमतौर पर आपके परीक्षण को चलाने से पहले जीसी करना एक अच्छा विचार है। यह system.time डिफ़ॉल्ट रूप से करता है।

अद्यतन @DWin के रूप में बताते हैं, आर (या सी #, या जावा आदि) हमेशा पता नहीं है जब स्मृति कम है और जीसी चलाने की जरूरत है। तो आपको स्मृति प्रणाली में कमियों के लिए कभी-कभी काम के रूप में जीसी करने की आवश्यकता हो सकती है।

11

माना जाता है कि आर केवल रैम का उपयोग करता है। मैक पर यह सच नहीं है (और मुझे संदेह है कि यह विंडोज़ पर भी सच नहीं है।) यदि यह रैम से बाहर हो जाता है, तो यह वर्चुअल मेमोरी का उपयोग करना शुरू कर देगा। कभी-कभी, लेकिन हमेशा नहीं, प्रक्रियाओं को 'पहचान' दिया जाएगा कि उन्हें जीसी() चलाने और स्मृति मुक्त करने की आवश्यकता है। जब वे ऐसा नहीं करते हैं, तो आप ActivityMonitor.app का उपयोग करके इसे देख सकते हैं और देख सकते हैं कि सभी रैम पर कब्जा कर लिया गया है और डिस्क का उपयोग बढ़ गया है। मुझे लगता है कि जब मैं बड़ा कॉक्स रिग्रेशन कर रहा हूं, तो मैं gc(); cph(...)

+0

मैं पुष्टि कर सकता हूं कि आर विंडोज़ पर पेजफाइल का उपयोग नहीं करता है, और कभी-कभी यह बहुत उपयोगी होगा। – skan

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