2017-06-13 8 views
0

実行時間を短縮するためにforeachループをコードに入れました。私が直面している問題は、出力のすべての入力レコードを取得していないということです。以下はコードスニペットです。並列化(foreach)がRで動作していません

# my_df has 100 records 
    library(doMC) 
    library(foreach) 
    no_cores <- detectCores() 
    registerDoMC(no_cores) 
    # nrow(my_df)=100 
    output <- foreach(combo = 1:nrow(my_df),.combine=rbind) %dopar% 
    { 
    df <- my_df[combo,] #taking 1 row at a time 

      ### do some operations #### 
     score <- sum(another_df$score1+another_df$score2) 

    if(score>score_cutoff){ 
    df$score <- score   
    }else{ 
    df$score <- 0} 

    df; #rbinding *df* to *output* 
    } 

出力データフレームに100レコードが含まれている必要がありますが、ランダムなレコード数(毎回100未満)が表示されています。私はforeach何回も使用しましたが、これが初めて起こっています。

誰でもこの問題を解決できますか? ありがとうございます。

+0

私はあなたがmy_df' '上の計算を実行していると仮定?あなたの操作が何であるか少し詳しく説明できますか? – Val

+0

@Val、質問のコードを編集しました。私がしているのは、_SCORE_を計算してその値を_df_に追加することです。 – santhoshverma

+0

@santhoshverma:どこに 'another_df'を宣言しますか? foreach文の前に? 'another_df'の一般的な形式は何ですか? 2列のdata.frame? – CPak

答えて

0

foreachの場合は、インデックスiをパラレル化します。あなたの場合、それはあなたのデータの行の数になるでしょうmy_df

あなたが計算するたびにrbindを使ってバインドするリストoutputの要素になります。ここまでは順調ですね。

あなたの結果がどれくらい正確に到着したのかは本当に言えませんが、一般的にループ内に非常に多くの変数を割り当てるのは良い考えではないと思います。

これは、私はそれを解決する方法をされ、その結果は、(100行を持っている)OKになります。

library(doParallel) 
no_cores <- detectCores() 

cl <- makeCluster(no_cores) 
registerDoParallel(cl) 

# simulate your data  
set.seed(42) 
my_df <- data.frame(A=sample(1:1000,100),B=sample(1:1000,100)) 

cutoff <- 500 

output <- foreach(i = 1:nrow(my_df),.combine=rbind) %dopar% 
{ 

    data.frame(A=my_df$A[i],B=my_df$B[i],Score=ifelse(my_df$A[i]+my_df$B[i] > cutoff,my_df$A[i]+my_df$B[i],0)) 

} 

stopCluster(cl) 
関連する問題