2015-12-14 36 views
3

我在具有128 GB RAM的機器上運行R 3.2.3。我有一個123028行×168列的大矩陣。我想在R中使用層次聚類算法,所以在我這樣做之前,我正嘗試使用Bray-Curtis方法中純素包中的vegdist()函數在R中創建距離矩陣。我得到內存分配錯誤:R在素食主義者的大距離矩陣

df <- as.data.frame(matrix(rnorm(20668704), nrow = 123028)) 
library(vegan) 
mydist <- vegdist(df) 

錯誤vegdist(DF): 長向量(參數4)未在.Fortran

支持如果我使用pryr包找出距離矩陣需要多少內存,我發現需要121 GB,這比我擁有的RAM要少。

library(pryr) 
mem_change(x <- 1:123028^2) 

121 GB

我知道過去有對R中的單個對象2個十億值的極限,但我認爲,限制在最新版本的R的消失是否有另一個內存限制我不知道?

底線是,我想知道:我能做些什麼關於這個錯誤?這是真的是因爲內存限制還是我錯了?我想留在R中,除了k-means之外還使用聚類算法,所以我需要計算一個距離矩陣。

+0

你可以隨時計算分段。 –

回答

4

R可以很好地處理長向量,但似乎距離矩陣計算在C或Fortran中實現,並且使用.C.Fortran與R接口,它不接受長向量(即長度> 2 ^作爲參數。請參閱該文檔here,其中規定:

。注意.C和.Fortran接口不接受長載體, 所以.CALL(或類似)已被使用。

綜觀source codevegdist()功能,它看起來像您的矩陣被轉換爲一個矢量,然後傳遞到用C語言實現,以計算的距離的函數。相關的代碼行數:

d <- .C("veg_distance", x = as.double(x), nr = N, nc = ncol(x), 
     d = double(N * (N - 1)/2), diag = as.integer(FALSE), 
     method = as.integer(method), NAOK = na.rm, PACKAGE = "vegan")$d 

而其中存在您的問題。當你的矩陣投射到一個矢量時,它變成一個長矢量,這不被.C支持。你將不得不尋找一個不同的包來計算你的距離矩陣(或者你自己實現一個)。

+0

謝謝!這確實回答了我爲什麼會遇到錯誤的問題。我的下一個問題是我能做些什麼呢?我可以嘗試按照Alex的說法分段進行,但是有沒有其他現有函數可以計算更大矩陣上的Bray-Curtis距離? – jk22

+0

@ jk22作爲第一步,你應該聯繫純素的作者。他們對我的經驗非常有幫助,並且可能能夠找到可以納入未來素食版本的解決方案。 – Tyler

+0

@ jk22做一個快速的谷歌搜索產生[ecodist](https://cran.r-project.org/web/packages/ecodist/)包,它具有'bcdist()'函數來計算Bray-Curtis距離。我不確定它是否處理較大的矩陣。 – ialm