我想并行化我正在处理的包的一部分。我应该使用哪些包和什么语法来使包在不同的体系结构上灵活可用?我的问题在一个 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没有任何参数“你将得到三个 worker 并且在类 Unix 系统上您将获得大约等于系统核心数一半的工作线程数。”
最佳答案
作为作者的future框架,我建议你看看future.apply包,例如
library(future.apply)
userFunc2 <- function(listOfX) {
res <- future_sapply(listOfX, .heavyStuff)
return(res)
}
默认设置是顺序运行,但如果用户愿意,他们可以使用他们喜欢的任何并行的 future 后端,例如
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
设计模式是你决定并行化什么,而用户如何并行化。
关于r - 如何并行化 R 中包的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53634543/