0

for ループを使用しているとき、オブジェクトを for ループ内で「成長」させるのではなく、オブジェクトを事前に割り当てて「埋める」べきであるというアドバイスに頻繁に遭遇しました。この経験則は foreach の使用にも適用されますか?

とてつもなく単純な例を挙げると、長さ 3 のベクトルをモンテカルロ描画のそれぞれでサンプリングし、各ベクトルを出力行列の各行に格納するとします。(私の実際のコードでは、描画ごとに一連の操作を行い、結果が別のマトリックスに表示される回数を数え、その数を最終出力に保存します。しかし、それは私の質問には関係ないと思います. )

fn <- function(sample_size, J){
  # Preallocate output matrix
  output <- matrix(NA, nrow = sample_size, ncol = J)
  foreach (i = 1:sample_size, .combine = 'rbind') %dopar% {
    output[i, ] <- runif(J)
    return(output)
    }
}

# Execute function in parallel 
system.cl = makeCluster(4)
registerDoParallel(system.cl)

fn(sample_size=100, J=3)

stopCluster(system.cl)
stopImplicitCluster()

この場合、事前割り当ては foreach に役立ちますか? 私の懸念は、出力マトリックスが一度大きなマトリックスとして作成され、次にforeach によって (塗りつぶされるのではなく)上書きされるため、時間とメモリを浪費するだけであるということです。

4

0 に答える 0