如何在R中为包的函数并行化

时间:2018-12-05 14:28:50

标签: r foreach parallel-processing parallel-foreach

我想并行化我正在处理的程序包的一部分。我应该使用哪些软件包和什么语法来使该软件包在不同的体系结构上灵活且可用?我的问题出在单个recode_all(df, old_value=2, new_value=3)调用中,如以下模拟代码所示:

sapply()

根据不同的指南,我炮制了以下内容:

.heavyStuff <- function(x) { 
   # do a lot of work
   Sys.sleep(1)
}

listOfX <- 1:20

userFunc1 <- function(listOfX) {    
  res <- sapply(listOfX, .heavyStuff)
  return(res)
}

问题:

  1. 我可以安全地在包装中使用这样的代码吗?它在各种平台上都能很好地工作吗?
  2. 有没有办法避免使用userFunc2 <- function(listOfX, dopar.arg=2) { if(requireNamespace("doParallel")) { doParallel::registerDoParallel(dopar.arg) res <- foreach(i=1:length(listOfX)) %dopar% { .heavyStuff(listOfX[[i]]) } names(res) <- names(listOfX) } else { res <- sapply(listOfX, .heavyStuff) } return(res) } 构造?我更喜欢使用类似sapply或lapply的函数。但是,并行库中的构造似乎更特定于平台。
  3. 如果foreach(),即使the introduction to doParallel says that不带任何参数,以上代码也无法工作:“您将获得三名工人,并且在类Unix系统上 您将获得的工作人员数量大约等于系统核心数量的一半。”

1 个答案:

答案 0 :(得分:1)

作为future框架的作者,我建议您看看future.apply软件包,例如

library(future.apply)
userFunc2 <- function(listOfX) {    
  res <- future_sapply(listOfX, .heavyStuff)
  return(res)
}

默认情况是事情按顺序运行,但是如果 user 希望,他们可以使用他们想要的任何并行将来的后端,例如

library(future)
plan(multiprocess)    # parallel on local machine - all cores by default

library(future.batchtools)
plan(batchtools_sge)  # parallel on an SGE compute cluster

library(future)
plan(sequential)      # sequentially

设计模式是您决定什么进行并行化,而用户如何进行并行化。