素食中的R大距离矩阵

时间:2015-12-14 21:41:59

标签: r memory hierarchical-clustering vegan

我在拥有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之外的聚类算法,因此我需要计算距离矩阵。

1 个答案:

答案 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不支持。您将不得不寻找一个不同的包来计算距离矩阵(或自己实现一个)。

相关问题