大矩阵和内存问题
Big matrix and memory problems
我正在处理一个庞大的数据集,我想推导出检验统计量的分布。因此,我需要使用巨大的矩阵 (200000x200000) 进行计算,正如您可能预测的那样,我有内存问题。更准确地说,我得到以下信息:错误:无法分配大小为... Gb 的向量。我在 64 位版本的 R 上工作,我的 RAM 是 8Gb。我尝试使用 bigmemory 包,但收效甚微。
第一个问题是计算距离矩阵。我在一个名为 Dist 的 map 包中发现了这个不错的函数,它可以并行计算数据帧的列的距离并且效果很好,但是它会生成 lower/upper 三角形。我需要距离矩阵来执行矩阵乘法,不幸的是我不能用矩阵的一半。当使用 as.matrix 功能使其充满时,我再次遇到内存问题。
所以我的问题是如何通过跳过 as.matrix 步骤将 dist 对象转换为 big.matrix。我想这可能是一个 Rccp 问题,请记住我是 Rccp 的新手。
提前致谢!
在将 "dist" 对象转换为“(大)矩阵”时:
stats:::as.matrix.dist
调用了 row
、col
、t
和创建大型中间对象的运算符。避免这些,您可以使用类似的方法:
有数据:
nr = 1e4
m = matrix(runif(nr), nr, 10)
d = dist(m)
然后,慢慢的分配填充一个"matrix":
#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
我正在处理一个庞大的数据集,我想推导出检验统计量的分布。因此,我需要使用巨大的矩阵 (200000x200000) 进行计算,正如您可能预测的那样,我有内存问题。更准确地说,我得到以下信息:错误:无法分配大小为... Gb 的向量。我在 64 位版本的 R 上工作,我的 RAM 是 8Gb。我尝试使用 bigmemory 包,但收效甚微。
第一个问题是计算距离矩阵。我在一个名为 Dist 的 map 包中发现了这个不错的函数,它可以并行计算数据帧的列的距离并且效果很好,但是它会生成 lower/upper 三角形。我需要距离矩阵来执行矩阵乘法,不幸的是我不能用矩阵的一半。当使用 as.matrix 功能使其充满时,我再次遇到内存问题。
所以我的问题是如何通过跳过 as.matrix 步骤将 dist 对象转换为 big.matrix。我想这可能是一个 Rccp 问题,请记住我是 Rccp 的新手。
提前致谢!
在将 "dist" 对象转换为“(大)矩阵”时:
stats:::as.matrix.dist
调用了 row
、col
、t
和创建大型中间对象的运算符。避免这些,您可以使用类似的方法:
有数据:
nr = 1e4
m = matrix(runif(nr), nr, 10)
d = dist(m)
然后,慢慢的分配填充一个"matrix":
#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