创建稀疏矩阵时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))
我正在尝试创建一个 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))