并行化(foreach)在R

时间:2017-06-13 09:37:26

标签: r foreach parallel-processing

我的代码中有一个 foreach 循环,以减少运行时间。我面临的问题是,我没有得到输出中的所有输入记录。以下是代码段。

    # 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 ,但这是第一次发生这种情况。

有人可以帮我解决这个问题吗? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

因此,foreach对你的索引i进行并列化。在您的情况下,这将是您的数据行my_df

您执行的每项计算都将成为使用output绑定在一起的列表rbind的元素。到目前为止一切都很好。

我无法确切地说你是如何得出结果的,但通常我认为在foreach循环中分配这么多变量是个好主意。

这就是我如何解决它,结果看起来没问题(有100行):

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)