2012-06-06 355 views
22

在向量化某些模擬代碼的過程中,我遇到了內存問題。我在Windows XP下使用32位R版本2.15.0(通過RStudio版本0.96.122)。我的機器有3.46 GB的RAM。內存分配「錯誤:無法分配大小爲75.1 Mb的向量」

> sessionInfo() 
R version 2.15.0 (2012-03-30) 
Platform: i386-pc-mingw32/i386 (32-bit) 

locale: 
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252 
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C       
[5] LC_TIME=English_United Kingdom.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] Matrix_1.0-6 lattice_0.20-6 MASS_7.3-18 

loaded via a namespace (and not attached): 
[1] grid_2.15.0 tools_2.15.0 

這是問題的一個小例子:

> memory.limit(3000) 
[1] 3000 
> rm(list = ls()) 
> gc() 
      used (Mb) gc trigger (Mb) max used (Mb) 
Ncells 1069761 28.6 1710298 45.7 1710298 45.7 
Vcells 901466 6.9 21692001 165.5 173386187 1322.9 
> N <- 894993 
> library(MASS) 
> sims <- mvrnorm(n = N, mu = rep(0, 11), Sigma = diag(nrow = 11)) 
> sims <- mvrnorm(n = N + 1, mu = rep(0, 11), Sigma = diag(nrow = 11)) 
Error: cannot allocate vector of size 75.1 Mb 

(在我的應用程序的協方差矩陣西格瑪不是對角線,但我得到了同樣的錯誤兩種方式。)

我在下午閱讀了有關R中的內存分配問題(包括hereherehere)。從我讀到的內容來看,我認爲這不是可用RAM本身,而是可用連續地址空間的問題。儘管如此,75.1Mb對我來說似乎很小。

我非常感謝您的任何想法或建議。

回答

25

R已經到了操作系統無法分配的地步另一個 75.1Mb的RAM塊。這是執行下一個子操作所需的內存塊的大小。這不是關於完成整個過程所需的連續RAM數量的說明。到此爲止,所有可用的RAM都已耗盡,但您需要更多的內存才能繼續操作,並且操作系統無法爲R提供更多的RAM。

對此的潛在解決方案是多方面的。顯而易見的是擁有更多RAM的64位機器。我忘記了32位Windows上的細節,但是IIRC,任何一個進程只能使用有限的內存(2GB?),而且無論Windows爲自己保留一大塊內存,所以R可用的內存將略低於3.4Gb你有。在64位Windows R上將能夠使用更多的RAM,並且可以適應/安裝的最大RAM量將會增加。

如果這是不可能的,那麼考慮一種替代方法;或許你的模擬批次的批次數小於N。這樣,您可以繪製更少數量的模擬,做任何您想要的,收集結果,然後重複此過程,直到完成足夠的模擬。你不顯示什麼N是,但我懷疑它是大的,所以嘗試更小的N多次給你N總的來說。

+0

在上面我舉的例子,N是894993.我希望避免使用循環或應用的一些變種,但也許我不能在這種情況下。 – inhuretnakht

+4

@ user1426701不,你不能。爲什麼[SO]上的每個人最近都想避免在R中使用for循環?使用它們並沒有什麼錯,它們很快,只要你先爲結果設置存儲空間,然後在循環中填充該對象。 –

+0

在這個特殊的例子中,當我減少複製次數以避免出現這種內存問題時,沒有循環的版本快了近5倍。這不是一個完全避免循環的問題,從三個嵌套循環到兩個循環。 – inhuretnakht

11

我不得不使用柵格包相同的警告。

> my_mask[my_mask[] != 1] <- NA 
Error: cannot allocate vector of size 5.4 Gb 

的解決方案是非常簡單的,幷包括在加大研發投入的存儲容量,這裏的代碼行:

##To know the current storage capacity 
> memory.limit() 
[1] 8103 
## To increase the storage capacity 
> memory.limit(size=56000) 
[1] 56000  
## I did this to increase my storage capacity to 7GB 

希望這會幫助你解決問題 乾杯

+0

得到這個。 'memory.limit(size = 56000)出錯: 不要傻!:你的機器有4Gb地址限制' –

+0

無論如何,爲我工作! :) – juandelsur

+0

我認爲這是因爲你的RAM比我的大。 –

0

無論您使用的N值是否R都會停止?嘗試使用較小的值並查看它是否是mvrnorm函數,或者您可以簡單地將它循環到子集上。在循環插入gc()函數來釋放一些RAM不斷