我想并行化我正在处理的程序包的一部分。我应该使用哪些软件包和什么语法来使该软件包在不同的体系结构上灵活且可用?我的问题出在单个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)
}
问题:
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的函数。但是,并行库中的构造似乎更特定于平台。foreach()
,即使the introduction to doParallel says that不带任何参数,以上代码也无法工作:“您将获得三名工人,并且在类Unix系统上
您将获得的工作人员数量大约等于系统核心数量的一半。” 答案 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
设计模式是您决定什么进行并行化,而用户如何进行并行化。