未解決の問題の概要:
1. メモリ不足 - マスター プロセスが必要とするメモリが多すぎますが、そうすべきではありません
一種の任意のネットワークの多くの組み合わせを計算しようとしますが、doparralel と foreach を使用していくつかの問題に遭遇しました。問題の特定のサイズでは、makeCluster(3) を使用しても、1 つのプロセスだけが開始されます。さらに、メモリが不足しています(〜50GBを使用した後-エラー:キル9-Macで)。奇妙なことは、問題のサイズが小さいことですが、すでに非常に大きく、問題なく実行されています。なぜメモリがいっぱいになり、複数のプロセスを開始しないのか、本当に意味がわかりません。大きすぎて計算できないのではないでしょうか?
コード:
pacman::p_load(iterpc, doSNOW,data.table, gtools, e1071)
source('adj.R', chdir = TRUE)
source('mm.R', chdir = TRUE)
ptm<-proc.time()
###with n<-5 and p<-3 it is running without any problems
n<-6 #genotype length
p<-3 #phenotype length
pevo<-NULL
prob<-NULL
I = iterpc(2^p, 2^n, replace=TRUE, ordered=F) #all combinations
bgg <- adjmatrix(n)
cl <- makeCluster(6)
registerDoSNOW(cl)
res<-foreach(elem = iter_wrapper(I,100) ,.combine='rbind') %dopar% {
gc()
rm()
for(z in 1:nrow(elem)){
bzz<-matmult(t(matmult(bgg,elem[z,])),elem[z,])
size<-NULL
for(k in 1:ncol(bzz)){
size[k]<-length(which(elem==k))
}
prob<-rbind(prob,diag(bzz)/colSums(bgz)/n)
diag(bzz)<-0
pevo<-rbind(pevo,colSums(bzz != 0))
}
return(cbind(pevo,prob))
}
proc.time()-ptm
write.table(res,'res2.txt',col.names=F,row.names=F,sep=" ")
print(object.size(res), units='auto')
gc()
rm()
これは私のアクティビティ モニターのスクリーンショットです。R プロセスの 1 つは、より多くのメモリ (最大 55GB) を消費します 。
エラーのスクリーンショットは次のとおりです:エラー
編集 09/22:
上記のコードを更新しました。doParallel の代わりに DoSNOW パッケージを使用すると、プロセスの問題が解決するようです。DoSNOW を使用すると、正しい量のプロセスが開始されます。しかし、これは新たな問題を引き起こしています。foreach の実行回数が多すぎます。
関数に追加しました:
bgg
関数 での計算adjmatrix
:adjmatrix <- function(n){ require(e1071) combi <- bincombinations(n) l <- length(combi[,1]) bgg <- matrix(0,l,l) for(i in 1:(length(combi[,1])-1)){ for(j in (i+1):length(combi[,1])){ check <- 0 for(h in 1:length(combi[j,])){ if(combi[j,h]!=combi[i,h]){ check <- check+1 } } if(check==1){ bgg[i,j] <- 1 bgg[j,i] <- 1 } } } return(bgg) }
bzz
関数 を使用したの計算をmatmult
次のように変更しました。matmult <- function(A,B){ c <- matrix(0,nrow(A),length(B)) for(i in 1:nrow(A)){ for(j in 1:length(B)){ sum <- 0 for(k in 1:length(B)){ if(j == B[k]){ sum <- sum+A[i,k]} } c[i,j] <- sum } } return(c) }
編集 09/23: 解決済み: DoSNOW パッケージ: foreach の実行回数が多すぎます
原因は、コードの次の部分でした。
if(is.null(prob)){
prob<-diag(bzz)/size/n
}
else{
prob<-rbind(prob,diag(bzz)/size/n)
}
diag(bzz)<-0
if(is.null(pevo)){
pevo<-colSums(bzz != 0)
}
else{
pevo<-rbind(pevo,colSums(bzz != 0))
}
次の変更により、正しい反復回数 (または結果) が得られます。
prob<-rbind(prob,diag(bzz)/colSums(bgz)/n)
diag(bzz)<-0
pevo<-rbind(pevo,colSums(bzz != 0))
コードを更新しました。