【发布时间】:2019-05-07 03:42:57
【问题描述】:
我想并行化我正在处理的包的一部分。我应该使用哪些包和什么语法来使包灵活且可用于不同的架构?我的问题在于单个 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)
}
问题:
- 我可以安全地在包中使用这样的代码吗?它能否在各种平台上正常运行?
- 有没有办法避免
foreach()构造?我更喜欢使用类似 sapply 或 lapply 的功能。但是,并行库中的结构似乎更加特定于平台。 - 如果
dopar.arg==NULL,上面的代码不起作用,即使the introduction to doParallel says that没有任何参数“你会得到三个工人和类Unix系统 您将获得大约相当于系统内核数量一半的工作人员数量。”
【问题讨论】:
标签: r foreach parallel-processing parallel-foreach