doParallel / doMC不仅适用于foreach包

时间:2015-09-08 14:42:38

标签: r parallel-processing doparallel domc

到目前为止,我发现的所有官方教程doParalleldoParallel-VignettedoMCdoMC-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

3 个答案:

答案 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)
},
...
)