【问题标题】:parallel foreach loops produce mclapply error并行 foreach 循环产生 mclapply 错误
【发布时间】:2013-06-28 22:51:00
【问题描述】:

这是我在 R 中进行并行计算的第一步。下面的代码会导致以下错误。我一无所知,因为我写的内容中没有 mclapply 函数,至少我没有明确说明。

错误:

Error in mclapply(argsList, FUN, mc.preschedule = preschedule, mc.set.seed = set.seed,  : 
  (list) object cannot be coerced to type 'integer'
Calls: %dopar% -> <Anonymous> -> mclapply
Execution halted

代码:

dist<-array(0, dim=c(320,500,25))

mc<-8
cl<-makeCluster(mc)
registerDoMC(cl)
opts<-list(chunkSize=10)

for(a in 1:25) {
  dist[,,a]<-foreach(x=1:500, .combine='cbind', .options.mc=opts) %:% 
    foreach(y=1:320, .combine='c') %dopar% {
      gcd.slc(crdsx[y,x], crdsy[y,x], lot[a,5], lot[a,4])
    }
}
stopCluster(cl)

在不同的机器上,它可以很好地工作

registerDoParallel(cl)

而不是

registerDoMC(cl)

【问题讨论】:

  • 能否将 sessionInfo() 添加到 OP 中?
  • 当您使用registerDoMC 注册并行后端时,函数doMC 设置为在您调用函数%dopar% 时执行。 doMC 包含对 mclapply 的调用,所以它就是从这里来的。

标签: r parallel-processing


【解决方案1】:

您收到该错误是因为registerDoMC 需要一个整数参数,而不是一个集群对象,而registerDoParallel 需要一个整数或一个集群对象。基本上,你需要决定使用哪个包而不是混合它们。

如果您使用doMC,那么您永远不会创建集群对象。一个最小的doMC 示例如下所示:

library(doMC)
registerDoMC(3)
foreach(i=1:10) %dopar% sqrt(i)

doParallel 包是doMCdoSNOW 包的混搭,因此您不需要使用集群对象。将前面的示例转换为doParallel 非常简单:

library(doParallel)
registerDoParallel(3)
foreach(i=1:10) %dopar% sqrt(i)

令人困惑的是,在 Windows 上,doParallel 实际上会在后台创建和使用集群对象,而在 Linux 和 Mac OS X 上,它不使用集群对象,因为它使用 mclapply 就像在doMC 包中。我认为这很方便,但可能会造成混乱。

【讨论】:

  • 谢谢。在修改了来自各种包的大量示例后,我在半夜留下了 registerDoMc(cluster)。经过第二次敏锐的思考,也许不会在早上问这个问题......将整数作为参数并完全依赖 doMC 确实是我想要的,谢谢!
猜你喜欢
  • 2016-05-31
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2019-01-14
  • 2018-01-22
  • 1970-01-01
  • 2018-11-01
  • 2019-10-24
相关资源
最近更新 更多