我在一台拥有128 GB内存的机器上运行R3.2.3。我有一个123028行x 168列的大矩阵。我想在R中使用分层聚类算法,因此在这样做之前,我尝试用Bray方法在纯素包中使用vegdist()函数在R中创建一个距离矩阵。我得到了一个内存分配错误:
df <- as.data.frame(matrix(rnorm(20668704), nrow = 123028))
library(vegan)
mydist <- vegdist(df)素食主义错误(Df):.Fortran不支持长向量(参数4)
如果我使用pryr包来找出距离矩阵需要多少内存,我就会发现需要121 GB,这比我所拥有的RAM要少。
library(pryr)
mem_change(x <- 1:123028^2)121 GB
我知道R中的单个对象曾经有20亿个值的限制,但我认为这个限制在最近版本的R中消失了,还有另一个我不知道的记忆限制吗?
底线是,我想知道:我能对这个错误做些什么呢?这真的是因为记忆的限制,还是我错了?我想留在R中,在k-均值之外使用聚类算法,所以我需要计算一个距离矩阵。
发布于 2015-12-14 22:20:27
R可以很好地处理长向量,但距离矩阵的计算似乎是用C或Fortran实现的,并且使用.C或.Fortran与R接口,后者不接受长向量(即长度大于2^32 -1的向量)。请参阅docs 这里,其中声明:
请注意,.C和.Fortran接口不接受长向量,因此必须使用.Call (或类似的)。
看看源代码的vegdist()函数,它看起来就像你的矩阵被转换成一个向量,然后传递给一个用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不支持它。您将不得不寻找一个不同的包来计算您的距离矩阵(或者自己实现一个)。
https://stackoverflow.com/questions/34277125
复制相似问题