大矩阵和内存问题

Posted

技术标签:

【中文标题】大矩阵和内存问题【英文标题】:Big matrix and memory problems 【发布时间】:2016-02-18 15:59:53 【问题描述】:

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

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

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

提前谢谢!

【问题讨论】:

您可以查看MRO 或switching the BLAS on OS X CRAN R。我不确定它是否有助于解决您的内存问题,但它肯定会加速矩阵运算。 有一个类似的big.matrix距离问题here可能会有所帮助。 【参考方案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

【讨论】:

非常感谢亚历克斯,这听起来可行。让我试试,我会回来反馈:)

以上是关于大矩阵和内存问题的主要内容,如果未能解决你的问题,请参考以下文章

如何“复制”矩阵而不在内存中创建导致内存溢出的临时矩阵?

读取和存储GPU的大矩阵文件

在有限内存上对大型矩阵进行矩阵运算

是否可以只保存对称矩阵的一半来节省内存?

c++动态内存分配-矩阵乘法

如何分割成块(子矩阵),或处理一个巨大的矩阵,在 numpy 上产生内存错误?