创建稀疏矩阵时R中的内存分配问题

Memory allotment problem in R while creating sparse matrix

我正在尝试创建一个 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 

请问有什么办法吗?

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

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

但在使用表达式的整个过程中保持稀疏性

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