1

未解決の問題の概要:

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 の実行回数が多すぎます。

関数に追加しました:

  1. 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)
    }
    
  2. 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))

コードを更新しました。

4

0 に答える 0