【问题标题】:Why the foreach loop using %dopar% don't produce all the results为什么使用 %dopar% 的 foreach 循环不会产生所有结果
【发布时间】:2014-02-26 10:13:36
【问题描述】:

我正在运行下面的代码,只得到 i=1 的结果。
如何获得 all 结果的行矩阵 - i=2 和 i=3?

library(doMC)
library(foreach)

number_of_cpus=4
cl<-makeCluster(number_of_cpus) 
registerDoMC(cores=4)


split_results2 <-

  foreach(i=1:3, .combine=rbind,  .inorder=TRUE, mc.cores=4) %dopar%  {

  Split_factor=as.character(split_factors[1,i])

  Data$Split_Factor = as.character(Data$Split_Factor)
  Data_new=Data[Data$Split_Factor==Split_factor,]


  GetSplit(Data_new,Data_ind,num_vars,num_factors,r_jobs,probs)  } 

【问题讨论】:

    标签: r foreach parallel-processing domc


    【解决方案1】:

    foreach 函数没有名为“mc.cores”的参数,因此它被视为迭代变量,但由于您只为它指定了一个值,因此它将循环限制为一次迭代。只需删除“mc.cores”参数,它就会按照您的预期工作。

    考虑这个循环:

    foreach(i=1:3, j=10) %dopar% {
      c(i, j)
    }
    

    受“j”限制,返回一个包含一个元素的列表,而这个循环:

    foreach(i=1:3, j=10:100) %dopar% {
      c(i, j)
    }
    

    受“i”限制,返回一个包含三个元素的列表。

    Foreach 并行迭代所有指定的迭代变量,因此循环受限于具有最少值的迭代变量。请注意,在这方面,foreach 的工作方式与“mapply”不同,后者使用更少的值循环迭代变量。

    另请注意,没有理由创建集群“cl”。它只会在你的机器上创建一些不会做任何事情的额外进程。

    【讨论】:

    • 我有一个类似的问题 - 我只传递给 foreach dopar 如下:i=1:10, .combine = list, .multicombine = TRUE 但是,我得到的输出长度小于 10。但是,由于我的计算很长而且内存可能很高,是否有可能因为内存或任何其他资源问题而默默地杀死工作人员?
    猜你喜欢
    • 2019-10-17
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 2017-04-29
    相关资源
    最近更新 更多