2016-07-12 3 views
2

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台のコンピュータの違いが増えたと私は信じている。

+0

計算の複雑さと比較してデータのサイズを知らなくても時間が合理的かどうかは言うまでもありません。 – agenis

+0

返事をありがとう。はい、私はそれが誰かがこれに答えることに問題があるかもしれないと思ったが、計算は自分自身を書いたかなり複雑な関数に基づいているので、誰かが本当にそれを投稿してもそれを通らないとは思わない。とにかく、関数はいくつかのラスターレイヤーを必要とするため、データも非常に大きくなります。あなたは私の最後の質問に関する経験がありますか(foreastは一般的に並列処理のための良いパッケージです)?私はこの問題をかなり新しくしています... – snoops

+0

まず、登録されたコアの数を 'getDoParWorkers()'でチェックして、すべてのことがうまくいくことを確認してみてください。 (foreachの前) – 989

答えて

1

はこれを試してみて、あなたの問題が解決されている場合、私に知らせて:

library(doParallel) 
library(foreach) 
registerDoParallel(cores=detectCores()) 
n <- length(newly_populated_vec) 
cat("\nN = ", n, " | Parallel workers count = ", getDoParWorkers(), "\n\n", sep="") 

t0 <- proc.time() 
Xenopus_Data <- foreach(b=1:n,.packages = c("raster", "gdistance", "rgdal","sp"), .combine=rbind) %dopar% { 
     Xenopus_Walk(
     water=water, 
     altdata=altdata, 
     habitat_suitability=habitat_suitability, 
     max_range_without_water=max_range_without_water, 
     max_range=max_range, 
     slope=slope, 
     Start_Pt=newly_populated_vec[b]) 
} 
TIME <- proc.time() - t0 

また、すべてのコアが計算に関与しているかどうかを確認するためにあなたのPC /ノートPCでの論理コアを監視してみてください。 (Windowsの場合はTaskManager、Linuxの場合はhtop

コアの数を2倍にしても、必ずしも2倍のパフォーマンスが得られるとは限りません。

+0

それは働いて、ありがとう。私たちの2つのアプローチの違いが何であるかを教えてください。私はあなたのことがより良く働いている理由を理解できますか?私は上の私の質問で新しい時を編集します。 – snoops

+0

'registerDoParallel()'を使った@snoopsは、クラスターの登録と停止の両方を処理します。また、 '.combine = rbind'を使用して並列スレッドの結果を結合します。さらに、 'foreach'ループの直前と直後のタイミングで、並列作業に必要なより正確な時間を捉えることができます。 – 989

+0

大丈夫です再度、感謝します ! – snoops

関連する問題