到目前为止,我发现的所有官方教程doParallel,doParallel-Vignette,doMC和doMC-Vignette仅涵盖了如何将并行计算与{{1}结合使用}。有没有办法加速“顺序”代码?
想象一下,就像将一个文件拆分成多个文件并使用不同的foreach
实例执行每个文件一样。 E.g。
R
提前致谢!
(R ## <run on core1>
data1 <- getData1()
dataResult1 <- doComplexAlgorithm1(data1)
## </run on core1>
## <run on core2>
data2 <- getData2()
dataResult2 <- doComplexAlgorithm2(data2)
## </run on core2>
## <run on core3>
data3 <- getData3()
dataResult3 <- doComplexAntotherAlgorithm3(data3)
## </run on core3>
## <run on core4>
data4 <- getData4()
dataResult4 <- doComplexNotSoComplexAlgorithm4(data4)
## </run on core4>
,RStudio v.3.2.1
)
答案 0 :(得分:2)
在基础(单一过程)方案中,您使用mapply
,并将其传递给您的功能列表:
mapply(function(getData, doAlg) {
dat <- getData()
doAlg(dat)
},
getData=list(getData1, getData2, getData3, getData4),
doAlg=list(algorithm1, algorithm2, algorithm3, algorithm4))
在并行处理案例中,您可以使用clusterMap
:
library(parallel)
cl <- makeCluster()
clusterMap(cl, function(getData, doAlg) {
dat <- getData()
doAlg(dat)
},
getData=list(getData1, getData2, getData3, getData4),
doAlg=list(algorithm1, algorithm2, algorithm3, algorithm4))
答案 1 :(得分:1)
听起来你想做我尝试用图像做的事情。 我有一些图像和一些计算,这本身需要很长时间。我的方式是有一个文件列表,并且:
foreach (i =1:length(fileList)) %dopar% {
- load data
- do something
- write result to disk
}
就像你说的那样,每一组数据(文件)都在自己的核心上进行处理,前提是你的系统有足够的内存来同时保存它们。
答案 2 :(得分:0)
因此,您不需要在每个作业之间进行任何内存共享或通信,或者它们是独立的工作。
foreach或lapply范例更适用于分割循环或向量过程。对于完全单独的作业,您需要包装另一层以使其成为循环。
将每个部分包装成一个函数,将所有函数放入一个列表中,然后循环调用每个函数。
fun_list <- list(
fun_1 <- function() {
data1 <- getData1()
doComplexAlgorithm1(data1)
},
fun_2 <- function() {
data2 <- getData1()
doComplexAlgorithm2(data2)
},
...
)