在向量化某些模擬代碼的過程中,我遇到了內存問題。我在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中的內存分配問題(包括here,here和here)。從我讀到的內容來看,我認爲這不是可用RAM本身,而是可用連續地址空間的問題。儘管如此,75.1Mb對我來說似乎很小。
我非常感謝您的任何想法或建議。
在上面我舉的例子,N是894993.我希望避免使用循環或應用的一些變種,但也許我不能在這種情況下。 – inhuretnakht
@ user1426701不,你不能。爲什麼[SO]上的每個人最近都想避免在R中使用for循環?使用它們並沒有什麼錯,它們很快,只要你先爲結果設置存儲空間,然後在循環中填充該對象。 –
在這個特殊的例子中,當我減少複製次數以避免出現這種內存問題時,沒有循環的版本快了近5倍。這不是一個完全避免循環的問題,從三個嵌套循環到兩個循環。 – inhuretnakht