使用R

时间:2019-05-23 13:30:08

标签: r memory linear-algebra

作为一个小例子,假设我对计算感兴趣:

r = v*M^t

其中r和v是向量,M是一个非常大的稀疏矩阵。

我可以通过以下两种方法之一解决它:

r = v*(M*M*M*M...)
r = ((((v*M)M)M)M)...

第一种方法导致中间密集矩阵无法存储在RAM中(对于我的目标最小用例,我至少需要10 TB的字节)。相反,第二种解决方案总是产生中间向量,并且实际上在实践中确实有效。

问题在于,当 t 的值较大时,内存分配会导致严重的性能瓶颈。

library(pryr)

n = 20000

v = 1:n

M = matrix(1:(n*n), n) # Not a sparse matrix like my use case, but easier to start with

for (i in 1:10) {
  v = v %*% M
  print(address(v))
}

如address()函数所示, v 在每次迭代中都被重新分配。它没有被修改到位。不仅内存分配会减慢速度,而且据专家证明,垃圾收集器也在不断被调用,并占用了大量时间。

所以我的问题是,有没有一种方法可以在R中执行此计算(以及其他可能与此类似的计算),而不会在后台发生过多的内存分配和gc()调用?

0 个答案:

没有答案