【问题标题】:Parallelization (foreach) is not working in R并行化(foreach)在 R 中不起作用
【发布时间】:2017-06-13 09:37:25
【问题描述】:

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

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

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

【问题讨论】:

  • 我假设您正在对my_df 执行计算?你能详细说明一下你的操作是什么吗?
  • @Val,我已经编辑了问题中的代码。我所做的只是计算 SCORE 并将该值添加到 df
  • @santhoshverma:你在哪里声明another_df?在foreach 声明之前? another_df的一般格式是什么? 2列data.frame?
  • @ChiPak,是的,another_df 是在 foreach 语句之外创建的。它是data.table 格式,它有超过2 列。我想在这里理解的是,如果我们引用foreach 语句之外的任何数据,parallel processingdoMc 包会有任何问题吗?

标签: r foreach parallel-processing


【解决方案1】:

所以对于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)

【讨论】:

    猜你喜欢
    • 2015-08-27
    • 2013-06-25
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多