首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行foreach循环产生mclapply错误

并行foreach循环产生mclapply错误
EN

Stack Overflow用户
提问于 2013-06-28 08:13:50
回答 1查看 2.3K关注 0票数 5

这些是我在R中使用并行计算的第一步。下面的代码导致以下错误。我一无所知,因为在我写的东西中没有mclapply函数,至少我没有明确地把它写出来。

错误:

代码语言:javascript
复制
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

代码:

代码语言:javascript
复制
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)

在另一台机器上,它可以很好地与

代码语言:javascript
复制
registerDoParallel(cl)

而不是

代码语言:javascript
复制
registerDoMC(cl)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-28 22:17:11

之所以会出现这个错误,是因为registerDoMC需要整数参数,而不是集群对象,而registerDoParallel需要整数或集群对象。基本上,您需要决定使用哪个包,而不是混合使用它们。

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

代码语言:javascript
复制
library(doMC)
registerDoMC(3)
foreach(i=1:10) %dopar% sqrt(i)

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

代码语言:javascript
复制
library(doParallel)
registerDoParallel(3)
foreach(i=1:10) %dopar% sqrt(i)

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17355288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档