使用并行包将具有不同参数的函数调用发送到R中的不同处理器

com*_*guy 6 parallel-processing r

我试图使用R中的并行包向四个不同的处理器发送四个不同的函数调用,但我真的迷失了如何分配不同的内核来做不同的工作.我已经阅读了R中并行包,doParallel,Rmpi和foreach的文档.我看过很多帖子使用mclapply来调用具有相同参数的不同函数.我想用不同的参数调用相同的函数.

这是我想要完成的伪代码:

BEGIN parallel (core)
if(core == 1)
   foo(5, 4, 1/2, 3, "a")
if(core == 2)
   foo(5, 3, 1/3, 1, "b")
if(core == 3)
   foo(5, 4, 1/4, 1, "c")
if(core == 4)
   foo(5, 2, 1/5, 0, "d")
END parallel
Run Code Online (Sandbox Code Playgroud)

这似乎是并行计算的完美应用,因为这四个独立的函数调用可以独立地解决我正在处理的问题.我不知道如何在R中这样做.

Sha*_*bho 2

试试这个:

第0步:设置集群和用户数据

library(parallel)
library(doParallel)
library(foreach)

cl <- makeCluster(4)          # Assuming 4 node cluster
registerDoParallel(cl) 

foo <- function(...) paste(...,collapse="-") # A dummy function:

(parDf <- data.frame(x1=5,x2=c(4,3,4,2),x3=1/(2:5),x4=3:0,x5=letters[1:4])) # Dummy parameters
parDf$x5 <- as.character(parDf$x5) 
Run Code Online (Sandbox Code Playgroud)

步骤1:查找每个节点的进程id:

nodeNames <- foreach(i = 1:length(cl), .combine=c) %dopar% {
  Sys.getpid()
}
Run Code Online (Sandbox Code Playgroud)

步骤 2:使用进程 ID 选择一组特定参数:

foreach(i = 1:10, .combine=c) %dopar% {
  paste(Sys.getpid(),foo(parDf[which(Sys.getpid()==nodeNames),]))
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!!