在r中同时运行多个作业(并行)

问题描述:

我想运行一个需要大量时间的程序。我想编写一个可以并行运行的函数(我是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

您可以使用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) 

我有很好的经验,使用plyr包函数以及由snow创建的并行后端。在a blog post我描述了如何做到这一点。在R 2.14并行处理之后,通过parallel包进行R核分发。我没有试图让plyr与parallel生成的后端一起工作,但我认为这应该起作用。