0

これまでに見つけたすべての公式チュートリアルdoParalleldoParallel-VignettedoMCdoMC-Vignetteは、 と組み合わせて並列計算を使用する方法のみをカバーしていforeachます。「シーケンシャル」コードも高速化する方法はありますか?

1 つのファイルを複数のファイルに分割し、各ファイルを異なるインスタンスで実行するようなものだと想像してください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 に答える