我在拥有128 GB RAM的计算机上运行R 3.2.3。我有一个123028行×168列的大矩阵。我想在R中使用层次聚类算法,所以在我这样做之前,我试图使用vegan包中的vegdist()函数和方法Bray-Curtis在R中创建一个距离矩阵。我收到有关内存分配的错误:
df <- as.data.frame(matrix(rnorm(20668704), nrow = 123028))
library(vegan)
mydist <- vegdist(df)
vegdist(df)出错: .Fortran
不支持long向量(参数4)
如果我使用pryr包来找出距离矩阵需要多少内存,我看到需要121 GB,这比我的RAM少。
library(pryr)
mem_change(x <- 1:123028^2)
121 GB
我知道R中的单个对象曾经有20亿个值的限制,但我认为这个限制在最近的R版本中消失了。还有其他内存限制吗?我不知道?
底线是我想知道:我该怎么办这个错误?这真的是因为内存限制还是我错了?我想留在R中并使用除k-means之外的聚类算法,因此我需要计算距离矩阵。
答案 0 :(得分:4)
R可以很好地处理长向量,但似乎距离矩阵计算是在C或Fortran中实现的,并且使用.C
或.Fortran
与R接口,它们不接受长向量(即,长度> 2 ^ 32 -1的矢量作为参数。请参阅文档here,其中声明:
请注意.C和.Fortran接口不接受长向量, 所以必须使用.Call(或类似的)。
查看vegdist()
函数的source code,看起来您的矩阵正在转换为向量,然后传递给在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
不支持。您将不得不寻找一个不同的包来计算距离矩阵(或自己实现一个)。