【问题标题】:Memory allotment problem in R while creating sparse matrix创建稀疏矩阵时R中的内存分配问题
【发布时间】:2019-12-18 10:19:20
【问题描述】:

我正在尝试创建一个 300kx300k 的稀疏矩阵,但我在 r 中遇到了内存问题,我使用的是 8gb Windows 10 笔记本电脑,此时获得一台具有更大内存的计算机会很困难,什么可以我确实在没有内存分配错误的情况下有效地创建了这个稀疏矩阵

我已经通过了 bigmemory 包,但我无法掌握它,因为它无法处理稀疏矩阵

这是一个较小的数据集,我计算它没有任何问题,但是当我尝试计算 300k x 300k 矩阵时出现问题

fam <- structure(list(ID = c(1L, 2L, 3L, 4L, 6L, 5L, 7L), dad = c(0L, 
                                                                  0L, 1L, 1L, 1L, 3L, 5L), mum = c(0L, 0L, 0L, 2L, 4L, 4L, 6L), 
                      GEN = c(1L, 1L, 2L, 2L, 3L, 3L, 4L)), class = "data.frame", row.names = c(NA, 
                                                                                                -7L))
library(Matrix)

hom = function(fam) {
  t1 <- min(which.max(fam$dad > 0), which.max(fam$mum > 0))
  t2 <- max(fam[["ID"]])


  A<-Matrix(0, nrow=t2,ncol=t2, sparse=TRUE)
  diag(A) <- 2-0.5^(fam[["GEN"]]-1)

  for (t in t1:t2) {
    A[t,t]<- sum(c(A[t,t],     0.5^(fam[t,"GEN"])*A[fam[t,"dad"],fam[t,"mum"]]))
    for(j in 1:(t-1))  {
      A[t,j]<- 0.5 * sum(c(A[j,fam[t,"dad"]],A[j,fam[t,"mum"]]))
      A[upper.tri(A)] <- t(A)[upper.tri(A)]
    }
  }
  A
}

我希望能够在不消耗大量内存的情况下有效地创建这个稀疏矩阵,但我遇到了这个错误:

Error: cannot allocate vector of size 300Gb 

请问我该怎么办?

【问题讨论】:

  • 您还没有向我们展示创建大矩阵的代码。您创建的 7x7 矩阵并不稀疏。
  • 我会去掉upper.tri 行,让它成为你的旧行。 A[j, t] &lt;- A[t,j] 的强度低于 upper.tri 版本。并不是说它对您的 300 GB 分配问题有帮助。
  • @user2554330 我同意生成的矩阵不是稀疏的。这是原帖stackoverflow.com/questions/57301390/…

标签: r memory bigdata vectorization sparse-matrix


【解决方案1】:

当您调用upper.tri(A) 时,您会失去索引中的稀疏性。您可以进行与

相同的计算
A[upper.tri(A)] <- t(A)[upper.tri(A)]

但在整个使用表达式时保持稀疏

A <- tril(A) + t(tril(A, -1))

【讨论】:

    猜你喜欢
    • 2018-12-14
    • 1970-01-01
    • 2018-12-24
    • 2016-01-13
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 2018-09-20
    • 2017-03-31
    相关资源
    最近更新 更多