2013-01-16 24 views
7

मैं 16 जीबी मेमोरी वाली मशीन पर कुछ सिमुलेशन चला रहा हूं। सबसे पहले, मैं कुछ त्रुटियों से मुलाकात की:स्मृति स्मृति के साथ आर मेमोरी समस्या()

Error: cannot allocate vector of size 6000.1 Mb (the number might be not accurate) 

तो मैं का उपयोग करके आर के लिए और अधिक स्मृति को आबंटित करने की कोशिश की:

memory.limit(1E10) 

इतनी बड़ी संख्या को चुनने का कारण यह है कि memory.limit मुझे चुनने की अनुमति नहीं कर सकता एक नंबर अपने सिस्टम की कुल स्मृति

In memory.size(size) : cannot decrease memory limit: ignored 

यह करने के बाद कम से कम, मैं अपने सिमुलेशन समाप्त कर सकते हैं, लेकिन आर 15GB स्मृति है, जो किसी भी पोस्ट analy करने से मेरी बंद कर दिया चारों ओर ले गया सीस।

मैंने object.size() का उपयोग सभी जेनरेटेड वैरिएबल का उपयोग करने वाली कुल मेमोरी का अनुमान लगाने के लिए किया था, जो केवल 10 जीबी लेता था। मैं यह नहीं समझ सका कि आर ने बाकी मेमोरी ली है। तो मेरा सवाल यह है कि मैं अपनी मशीन को विस्फोट किए बिना उचित रूप से आर को स्मृति आवंटित कैसे करूं? धन्यवाद!

+2

क्या आप वाकई सभी मौजूदा चर देख चुके हैं? क्या 'ls (all = TRUE) 'केवल आपके द्वारा जेनरेट की गई सूची सूचीबद्ध करता है? ध्यान दें कि यदि कोई ऑब्जेक्ट हटा दिया जाता है, तो उस ऑब्जेक्ट को स्टोर करने के लिए उपयोग की जाने वाली मेमोरी कचरा कलेक्टर कहलाए जाने तक निःशुल्क नहीं होती है। आर समय-समय पर करता है, लेकिन आप 'gc() 'के साथ संग्रह को मजबूर कर सकते हैं। –

+0

मैंने अपनी सभी मेमोरी के लिए मेमोरी उपयोग की जांच नहीं की है। लेकिन मैंने प्रत्येक पुनरावृत्ति के बाद अपने सिमुलेशन में जीसी() का उपयोग किया ... –

+2

सामान्य रूप से, आपको अपनी ऑब्जेक्ट्स पर कितनी मेमोरी की मात्रा की आवश्यकता होती है। यह वस्तुओं की प्रतिलिपि बनाने के कारण है। –

उत्तर

2

आर का अर्थ है WYSINAWYG (जो आप देखते हैं वह हमेशा आपको प्राप्त नहीं होता है)। जैसा कि टिप्पणियों में उल्लेख किया गया है, आपको कहानियों की प्रतिलिपि बनाने के कारण अपनी वस्तुओं के भंडारण के लिए आवश्यक अधिक स्मृति की आवश्यकता है। साथ ही, यह संभव है कि अक्षम होने के अलावा, नेस्टेड for लूप एक बुरा विचार है क्योंकि gc सबसे निचले लूप में नहीं चलेगा। मेरा सुझाव है कि आप इनमें से किसी है, तो आप vectorised तरीकों का उपयोग कर उन्हें हटाने के लिए प्रयास करें, या यदि आप स्वयं अपनी छोरों में gc फोन कचरा संग्रह के लिए मजबूर करने, लेकिन यह चीजों को नीचे कुछ हद तक

सरल के लिए आवश्यक स्मृति का मुद्दा धीमी हो जाएगी चेतावनी दी वस्तुओं को निम्नलिखित उदाहरण से सचित्र किया जा सकता है। यह कोड data.frame ऑब्जेक्ट बढ़ता है। पहले, परिणामस्वरूप ऑब्जेक्ट आकार के बाद मेमोरी उपयोग देखें। gc से पहले जमा होने की बहुत सारी कचरा है। मुझे लगता है कि विंडोज़ पर कचरा संग्रह * निक्स सिस्टम की तुलना में समस्याग्रस्त है। मैं मैक ओएस एक्स पर नीचे दिए गए उदाहरण को दोहराने में सक्षम नहीं हूं, लेकिन मैं बार-बार विंडोज पर कर सकता हूं। लूप और अधिक स्पष्टीकरण The R Inferno पृष्ठ 13 में पाया जा सकता है ...

# Current memory usage in Mb 
memory.size() 
# [1] 130.61 
n = 1000 

# Run loop overwriting current objects 
my.df <- data.frame(a=character(0), b=numeric(0)) 
for(i in 1:n) { 
this.N <- rpois(1, 10) 
my.df <- rbind(my.df, data.frame(a=sample(letters, 
this.N, replace=TRUE), b=runif(this.N))) 
} 
# Current memory usage afterwards (in Mb) 
memory.size() 
# [1] 136.34 

# BUT... Size of my.df 
print(object.size(my.df) , units = "Mb") 
0.1 Mb 
संबंधित मुद्दे