2013-01-16 131 views
7

我在16GB內存的計算機上運行一些模擬。首先,我遇到了一些錯誤:R內存問題與memory.limit()

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

然後我試圖通過分配更多的內存以R:

memory.limit(1E10) 

選擇這樣一個大的數字的原因是因爲memory.limit不能讓我選擇的比我的系統總內存

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

這樣做了以後少一些,我可以完成我的模擬,但[R前後花了15GB的內存,它停在我從做任何後期ANALY SIS。

我用object.size()來估計所有生成的變量的總內存使用量,這個變量只花了10GB左右。我無法確定R在剩下的記憶中所佔的位置。所以我的問題是如何合理地分配內存給R而不會爆炸我的機器? 謝謝!

+2

你確定你已經看過所有現有的變量嗎? 'ls(all = TRUE)'只列出你生成的那些?請注意,即使刪除了一個對象,在調用垃圾收集器之前用於存儲該對象的內存也不是空閒的。 R定期執行此操作,但可以使用'gc()'強制收集。 –

+0

我還沒有檢查過我所有內存的內存使用情況。但是,在每次迭代後,我在模擬中都使用了gc()... –

+2

一般來說,您需要大約3倍的對象佔用的內存量。這是因爲複製對象。 –

回答

2

R被解釋爲WYSINAWYG(你看到的並不總是你得到的)。正如在註釋中提到的那樣,由於複製所述對象,需要存儲對象所需的更多內存。此外,除了低效之外,嵌套的for循環可能是一個壞主意,因爲gc不會在最內層的循環中運行。如果您有任何這些,我建議您嘗試使用矢量化方法刪除它們,或者在循環中手動調用gc以強制垃圾回收,但要注意這會使速度降低一些

內存問題可以通過以下示例來說明對象。此代碼增長一個data.frame對象。觀察內存使用之前,之後以及由此產生的對象大小。在調用gc之前,有很多垃圾可以累積。我認爲垃圾收集在Windows上比* nix系統有問題。我無法在Mac OS X上的底部複製該示例,但我可以在Windows上重複使用該示例。該循環和更多的解釋可以在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