0

到目前为止,我发现的所有官方教程doParalleldoParallel-VignettedoMCdoMC-Vignette仅涵盖如何将并行计算与foreach. 有没有办法加快“顺序”代码的速度?

想象一下,它就像将一个文件拆分为多个文件并使用不同的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>

提前致谢!

(R v.3.2.1,R工作室v.0.99.451

4

3 回答 3

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))
于 2015-09-14T09:04:37.490 回答
1

听起来你想做我试图用图像做的事情。我有一些图像和一些计算,这本身就需要很长时间。我的方法是有一个文件列表,并且:

foreach (i =1:length(fileList)) %dopar% { 
    - load data
    - do something
    - write result to disk
} 

正如您所说,每组数据(文件)都在其自己的核心上进行处理,前提是您的系统有足够的内存来一次保存所有数据。

于 2015-09-11T23:34:31.817 回答
0

因此,您不需要在每个作业之间进行任何内存共享或通信,或者它们是独立的作业。

foreach 或 lapply 范式更多地设计用于拆分循环或向量过程。对于完全独立的作业,您需要包裹另一层以使其成为一个循环。

将每个部分包装成一个函数,将所有函数放入一个列表中,然后循环调用每个函数。

fun_list <- list(
  fun_1 <- function() {
    data1 <- getData1()
    doComplexAlgorithm1(data1)
},
    fun_2 <- function() {
    data2 <- getData1()
    doComplexAlgorithm2(data2)
},
...
)
于 2017-07-12T14:35:23.530 回答