大矩阵和内存问题

时间:2016-02-18 15:59:53

标签: r matrix r-bigmemory bigdata

我正在研究一个庞大的数据集,我想得出一个测试统计数据的分布。因此,我需要使用巨大的矩阵(200000x200000)进行计算,因为您可能预测我会遇到内存问题。更确切地说,我得到以下内容:错误:无法分配大小的矢量... Gb。我在64位版本的R上工作,我的RAM是8Gb。我尝试使用bigmemory包,但没有取得多大成功。

第一个问题出现在我必须计算距离矩阵时。我在名为Dist的amap包中发现了这个很好的函数,它计算了数据帧的列在平行上的距离并且它运行良好,但它产生了下/上三角形。我需要距离矩阵来执行矩阵乘法,不幸的是我不能用矩阵的一半。当使用as.matrix函数使其充满时,我再次遇到内存问题。

所以我的问题是如何通过跳过as.matrix步骤将dist对象转换为big.matrix。我想这可能是一个Rccp问题,请记住我在Rccp上真的很新。

提前完成!

1 个答案:

答案 0 :(得分:0)

转换" dist"反对"(大。)矩阵": 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