大矩阵和内存问题

5
我正在处理一个巨大的数据集,并且我想推导出一个检验统计量的分布。因此,我需要使用巨大的矩阵(200000x200000)进行计算,正如你所预测的那样,我遇到了内存问题。更具体地说,我遇到了以下错误:无法分配大小为...Gb的向量。我使用的是64位版本的R,我的RAM为8Gb。我尝试使用bigmemory包,但效果不太好。
第一个问题出现在我必须计算距离矩阵时。我发现amap包中有一个很好的函数叫做Dist,可以并行计算数据框的列之间的距离,并且它运行良好,但是它只产生下三角/上三角矩阵。我需要距离矩阵进行矩阵乘法,但是半个矩阵是没法用的。当我使用as.matrix函数将其转化为完整矩阵时,我又遇到了内存问题。
因此,我的问题是如何通过跳过as.matrix步骤将dist对象转换为big.matrix。我想这可能是一个Rccp问题,请记住我对Rccp还很陌生。
提前感谢!

你可以查看MRO或者在OS X CRAN R上切换BLAS。我不确定它是否能解决你的内存问题,但肯定会加速矩阵运算。 - alistaire
这里有一个类似的big.matrix距离问题,链接,可能会有所帮助。 - cdeterman
1个回答

1
在将“dist”对象转换为“(big.)matrix”时: stats:::as.matrix.dist 调用了 rowcolt 和创建大型中间对象的运算符。为避免这些问题,您可以使用以下其中一种替代方法之一:

使用数据:

nr = 1e4
m = matrix(runif(nr), nr, 10)
d = dist(m)

然后,慢慢地分配并填充一个“矩阵”:
#as.matrix(d) #this gives error on my machine
n = attr(d, "Size")
md = matrix(0, n, n) 
id = cumsum(c(1L, (n - 1L) - 0:(n - 2L))) #to split "d"
for(j in 1:(n - 1L)) {
    i = (j + 1L):n
    md[i, j] = md[j, i] = d[id[j]:(id[j] + (n - (j + 1L)))]
}

看起来使用将“md”分配为big.matrix(n, n, init = 0)同样有效。

md[2:5, 1]
#[1] 2.64625973 2.01071637 0.09207748 0.09346157
d[1:4]
#[1] 2.64625973 2.01071637 0.09207748 0.09346157

使用较小的“nr”,我们可以测试:
all.equal(as.matrix(md), as.matrix(d), check.attributes = FALSE)
#[1] TRUE

非常感谢Alex,听起来可行。让我试一下,然后我会回来反馈 :) - Akis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接