2012-05-30 17 views
5

相当な時間がかかるプログラムを実行したい。私は並列に実行できる関数を書いてみたい(私はWindowsでグラフィカルインターフェイスのユーザーです)。この関数は、タスクをn個のサブタスクに分割し、最終コンセンサスタスクを実行します。私は並列に(同じプログラムウィンドウ内で同じ時間に)n個のタスクを実行し、その後出力を結合したいと思います。以下、単に例:私はUNIXで知っ複数のジョブをバックグラウンドで同時に実行する(並列)r

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) 

は「&」は、通常のジョブがバックグラウンドで実行することができます。同様の方法がありますか?

+1

見て、それがR 2.15に含まれています: 'パラレル:: parallel' –

+0

なお十分にマルチコアプロセッサなしで、あなたが並列化から入手することができます利益の量は限られているのに?。 – Fhnuzoag

答えて

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) 
1

snowで作成された並列バックエンドと一緒にplyrパッケージ機能を使用した経験があります。 a blog postでこれを行う方法を説明します。 R 2.14の後、並列処理は、parallelパッケージを介したRコア配布の一部です。私はparallelによって生成されたバックエンドでplyrを動作させようとしませんでしたが、これはうまくいくはずです。

関連する問題