2012-05-30 109 views
5

我想運行一個需要大量時間的程序。我想編寫一個可以並行運行的函數(我是windows中的圖形用戶界面)。該功能將任務分成n個子任務並執行最終的共識任務。我想並行運行n個任務(在同一個程序窗口中同時運行),然後組合輸出。下面只是一個例子:在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) 

我知道在UNIX中的「&」通常允許工作在後臺運行。是否有類似的方式在R

+1

看看並行包,它屬於R 2.15:'平行:: parallel' –

+0

但請注意,如果沒有足夠多核心處理器,利益可以從並行化獲得的量是有限的。 – Fhnuzoag

回答

7

您可以使用mclapplyclusterApply 並行啓動多個功能。 他們不是真的在後臺: R將等待,直到它們全部完成 (如果您在Unix shell中使用wait,在後臺啓動進程後使用 )。

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

我有很好的經驗,使用plyr包函數以及由snow創建的並行後端。在a blog post我描述瞭如何做到這一點。在R 2.14並行處理之後,通過parallel包進行R核分發。我沒有試圖讓plyr與parallel生成的後端一起工作,但我認爲這應該起作用。

相關問題