如何在群集/本地计算机的所有节点中运行常规R脚本(并行处理)

时间:2018-11-05 12:43:13

标签: r parallel-processing cluster-computing

我有4种不同的功能,这些功能目前正在串行运行,但是却消耗大量时间。我的本地系统具有4个核心。如何在所有4个内核中并行运行这4个功能。示例:内核1中的功能1,内核2中的功能2等。 注意:这四个功能是独立的。

我尝试了以下来自库并行的代码,但是发现执行时间没有显着差异。请帮助

library(parallel)
 cl <- makeCluster(4)

 clusterExport(cl, varlist=c("foo", "foo1", "foo2", "foo3"))
 cores <- seq_along(cl)

clusterApply(cl[cores], cores, function(core) {
   if (core == 1) {
     foo(5, 4)
   } else if (core == 2) {
     foo1(5, 3)
   } else if (core == 3) {
     foo2(5, 4)
   } else if (core == 4) {
     foo3(5, 2)
   }
 })

stopCluster(cl)

1 个答案:

答案 0 :(得分:0)

这可以使用future软件包提供的核心Future API进行处理(免责声明:我是作者)。

这是要点:

library(future)
plan(multisession)  ## all cores by default

## Launch functions asynchronously via futures
f0 <- future(foo(5, 4))
f1 <- future(foo1(5, 3))
f2 <- future(foo2(5, 4))
f3 <- future(foo3(5, 2))

## Wait for their values
v0 <- value(f0)
v1 <- value(f1)
v2 <- value(f2)
v3 <- value(f3)

您可以使用所谓的未来分配来实现相同的目的,而不是显式的future()/value()调用:

library(future)
plan(multisession)  ## all cores by default

v0 %<-% foo(5, 4)
v1 %<-% foo1(5, 3)
v2 %<-% foo2(5, 4)
v3 %<-% foo3(5, 2)

## wait for, say, v2 only when you actually "need" the value
print(v2)