我想运行一个需要大量时间的程序。我想写一个可以并行运行的函数(我是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“&amp;”通常允许作业在后台运行。在R
中是否有类似的方法答案 0 :(得分:7)
您可以使用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)
答案 1 :(得分:1)
我有使用plyr
包函数和snow
创建的并行后端的良好经验。在a blog post我描述了如何做到这一点。在R 2.14之后,并行处理是通过parallel
包的R核分发的一部分。我没有试图让plyr使用parallel
生成的后端,但我认为这应该有效。