5

かなりの時間を必要とするプログラムを実行したい。並行して実行できる関数を書きたいです (私は Windows のグラフィカル インターフェイス ユーザーです)。この関数は、タスクを n 個のサブタスクに分割し、最終合意タスクを実行します。n 個のタスクを並行して (同じプログラム ウィンドウ内で同時に) 実行し、出力を結合したいと考えています。以下はほんの一例です:

ptm <- proc.time()
j1 <- cov(mtcars[1:10,], use="complete.obs") # job 1
j2 <- cov(mtcars[11:20,], use="complete.obs") # job 2
j3 <- cov(mtcars[21:32,], use="complete.obs") # job 3
proc.time() - ptm

out <- list (j1 = j1, j2 = j2, j3 = j3) 

UNIX では、通常、「&」を使用するとジョブをバックグラウンドで実行できることを知っています。Rにも同様の方法がありますか

4

2 に答える 2

7

mclapplyまたはを使用clusterApply して、複数の機能を並行して起動できます。それらは実際にはバックグラウンドにあるわけではありません: R はそれらがすべて終了するまで待機します (waitバックグラウンドでプロセスを起動した後、Unix シェルで を使用しているかのように)。

library(parallel)
tasks <- list(
  job1 = function() cov(mtcars[1:10,],  use="complete.obs"),
  job2 = function() cov(mtcars[11:20,], use="complete.obs"),
  job3 = function() cov(mtcars[21:32,], use="complete.obs"),
  # To check that the computations are indeed running in parallel.
  job4 = function() for (i in 1:5) { cat("4"); Sys.sleep(1) },
  job5 = function() for (i in 1:5) { cat("5"); Sys.sleep(1) },
  job6 = function() for (i in 1:5) { cat("6"); Sys.sleep(1) }
)

# Using fork()
out <- mclapply( 
  tasks, 
  function(f) f(), 
  mc.cores = length(tasks) 
)

# Equivalently: create a cluster and destroy it.
# (This may work on Windows as well.)
cl <- makeCluster( length(tasks) )
out <- clusterApply( 
  cl,
  tasks,
  function(f) f()
)
stopCluster(cl)
于 2012-05-31T12:40:40.443 に答える
1

plyrによって作成された並列バックエンドと一緒にパッケージ関数を使用した良い経験がありますsnowブログ投稿で、これを行う方法を説明しています。R 2.14 以降の並列処理は、parallelパッケージを介した R コア ディストリビューションの一部です。によって生成されたバックエンドで plyr を動作させようとしたことはありませんがparallel、これは動作するはずです。

于 2012-05-30T14:24:19.560 に答える