在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
答
您可以使用mclapply
或clusterApply
并行启动多个功能。 他们不是真的在后台: 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
生成的后端一起工作,但我认为这应该起作用。
看看并行包,它属于R 2.15:'平行:: parallel' –
但请注意,如果没有足够多核心处理器,利益可以从并行化获得的量是有限的。 – Fhnuzoag