2012-01-11 11 views
39

के बीच क्या अंतर है मैं समय-समय पर rm(list=ls()) पर कॉल का उपयोग करके आर में स्मृति की सफाई कर रहा हूं।
क्या मुझे उसके बाद कचरा कलेक्टर gc() पर कॉल करने की आवश्यकता है?जीसी() और आरएम()

इन 2 कार्यों के बीच क्या अंतर है? gc() कुछ चर के लिए rm() पर कॉल करें?

उत्तर

57

सबसे पहले, यह है कि क्या ध्यान दें कि दो कि gc में बहुत अलग किसी भी चर कि आप अभी भी कर रहे हैं using- को नहीं हटाता है यह केवल लोगों को है कि आप अब की पहुंच है के लिए स्मृति भी मुक्त हो रहे हैं (महत्वपूर्ण है rm() का उपयोग करके हटा दिया गया है, या कहें, एक फ़ंक्शन में बनाया गया है जो तब से लौटा है)। चल रहा है gc() आपको कभी भी चर खोने नहीं देगा।

rm() पर कॉल करने के बाद आपको gc() पर कॉल करना चाहिए या नहीं, हालांकि, यह एक अच्छा है। जीसी के लिए documentation मददगार नोट्स:

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

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

तो जवाब है कि यह gc() कॉल करने के लिए (और बहुत कम से कम, चोट नहीं कर सकते हैं), भले ही यह संभावना है (जल्द ही नहीं तो तुरंत, तो) वैसे भी ट्रिगर हो जाएगा अच्छा हो सकता है।

+0

आपके उत्तर के लिए धन्यवाद। आम तौर पर, आर स्वचालित कचरा संग्रह अच्छा माना जाता है? (उदाहरण के लिए जावा के रूप में मजबूत के रूप में) – RockScience

+0

जवाब देने के लिए यह एक कठिन सवाल है, मुझे यकीन नहीं है। [यह सवाल] (http://stackoverflow.com/questions/1467201/forcing-garbage-collection-to-run-in-r-with-the-gc-command) उपयोगी है। –

+5

आम तौर पर आपको जीसी कॉल नहीं करना चाहिए, और यदि आप ऐसा करते हैं तो इसमें बहुत अंतर नहीं होता है। – hadley

-1

व्यक्तिगत रूप से मैं gc() को कुछ रैम मुक्त करने के लिए लूप में शामिल करना पसंद करता हूं जब लूप उपलब्ध स्थान को भरना शुरू करते हैं। कुछ

for(i in 1:1000){ 
res[[i]] = some operation 
gc() 
} 
+5

कृपया कॉल करने के लिए जागरूक रहें जीसी() प्रति कॉल 100ms के क्रम में एक भारी प्रदर्शन जुर्माना के साथ आता है। तो इस मामले में आपका कोड आवश्यक से लगभग 100 सेकंड लंबा चला जाएगा :) – ThankGoat

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