3

複数のデータ セットに対する長時間実行分析 (24 時間以上) の実行が終了しました。私は怠け者で、複数のRセッションを処理して後で結果をまとめたくなかったので、 を使用してそれらを並行して実行しましたforeach

分析により、結果 (および中間オブジェクト) でいっぱいの環境が返されるため、結果をグローバル環境に割り当てようとしましたが、これが機能しないことがわかりました。説明するコードを次に示します。

library(doMC)
library(foreach)
registerDoMC(3)

bigAnalysis <- function(matr) {
  results <- new.env()
  results$num1 <- 1
  results$m <- matrix(1:9, 3, 3)
  results$l <- list(1, list(3,4))

  return(results)
}

a <- new.env()
b <- new.env()
c <- new.env()

foreach(i = 1:3) %dopar% {
  if (i == 1) {
    a <<- bigAnalysis(data1)
    plot(a$m[,1], a$m[,2]) # assignment has worked here
  } else if (i == 2) {
    b <<- bigAnalysis(data2)
  } else {
    c <<- bigAnalysis(data3)
  }
}

# Nothing stored :(
ls(envir=a)
# character(0)

以前に(関数内で)グローバル割り当てを使用foreachして、事前に設定した行列にデータを入力したことがあります( ではうまくできなかった場所.combine)ので、これでうまくいくと思いました。

編集:これは関数の本体内でのみ機能するようです:

f <- function() {
  foreach(i = 1:3) %dopar% {
    if (i == 1) {
      a <<- bigAnalysis(data1)
    } else if (i == 2) {
      b <<- bigAnalysis(data2)
    } else {
      c <<- bigAnalysis(data3)
    }
  }
  d <- new.env()
  d$a <- a
  d$b <- b
  d$c <- c
  return(d)
}

これが関数では機能するのに、トップレベル環境では機能しないのはなぜですか?

4

1 に答える 1

3

foreachによってフォークされたワーカー プロセスで発生しているため、ループ内のグローバル変数に割り当てようとすると失敗しmclapplyます。これらの変数はマスター プロセスに送り返されないため、失われます。

次のようなことを試すことができます:

r <- foreach(i = 1:3) %dopar% {
  if (i == 1) {
    bigAnalysis(data1)
  } else if (i == 2) {
    bigAnalysis(data2)
  } else {
    bigAnalysis(data3)
  }
}

a <- r[[1]]
b <- r[[2]]
c <- r[[3]]
ls(a)

これは、リスト内の 3 つの環境オブジェクトを返すデフォルトの結合関数を使用します。

関数内でループを実行しforeachても機能しません。registerDoMCただし、実際に順番に実行するために呼び出しを行わなくても、割り当ては機能します。その場合、実際にはマスター プロセスのグローバル環境に割り当てを行っています。

于 2013-09-13T19:43:51.543 に答える