foreach-packageを使用して並列処理しようとしているコードがあります。コードは動作していますが、4つのコアを搭載したコンピュータで実行すると約26分かかってしまいます.32コアで1つに切り替えると、13分もかかります。私は8倍のコアを使用しているので何か間違っているのかどうか疑問に思っていましたが、時間を半分に減らすだけです。Rの並列処理が間違っていますか?
Time_of_Start
[1] "2016-07-12 13:07:23 CEST"
Time_of_end
[1] "2016-07-12 13:33:10 CEST"
And for the one with 32 cores:
Time_of_Start
[1] "2016-07-12 14:35:48 CEST"
Time_of_end
[1] "2016-07-12 14:48:08 CEST"
これは正常です:私は、次の時間を取得する4つのコアを持つコンピュータの場合
no_cores <- detectCores()
cl <- makeCluster(no_cores)
registerDoParallel(cl)
Xenopus_Data <- foreach(b=1:length(newly_populated_vec),.packages = c("raster", "gdistance", "rgdal","sp")) %dopar% { Xenopus_Walk(altdata=altdata,water=water,habitat_suitability=habitat_suitability,max_range_without_water=max_range_without_water,max_range=max_range,slope=slope,Start_Pt=newly_populated_vec[b]) }
stopCluster(cl)
:私のコードは次のようになりますか?もしそうなら、誰かがそれをさらに高速化する方法を知っていますか、おそらく異なるパッケージを使用していますか? どんなタイプのヘルプも大歓迎です!
EDIT:これは、是正措置を適用した後の時間です。
User System elapsed
5.99 40.78 243.97
4用コア:32個のコアの場合は前に、私はいくつかのループを介して、計算を複数回行った
user system elapsed
1.91 0.94 991.71
注意、計算時間が非常に大幅に減少した理由ですが、一つはまだ伝えることができます2台のコンピュータの違いが増えたと私は信じている。
計算の複雑さと比較してデータのサイズを知らなくても時間が合理的かどうかは言うまでもありません。 – agenis
返事をありがとう。はい、私はそれが誰かがこれに答えることに問題があるかもしれないと思ったが、計算は自分自身を書いたかなり複雑な関数に基づいているので、誰かが本当にそれを投稿してもそれを通らないとは思わない。とにかく、関数はいくつかのラスターレイヤーを必要とするため、データも非常に大きくなります。あなたは私の最後の質問に関する経験がありますか(foreastは一般的に並列処理のための良いパッケージです)?私はこの問題をかなり新しくしています... – snoops
まず、登録されたコアの数を 'getDoParWorkers()'でチェックして、すべてのことがうまくいくことを確認してみてください。 (foreachの前) – 989