1

我正在本地并行运行任务,使用包中的%dopar%包来创建集群(目前在 Windows 机器上运行)。我以前做过很多次,它工作正常,直到我在其中使用(即非并行)放置一个不相关的循环。然后 R 给了我错误(带有回溯):foreachdoSNOWforeach%do%

 Error in { : task 1 failed - "could not find function "%do%""  3 stop(simpleError(msg, call = expr))  2 e$fun(obj, substitute(ex), parent.frame(), e$data)  1 foreach(rc = 1:5) %dopar% {
    aRandomCounter = -1
    if (1 > 0) {
        for (batchi in 1:20) { ...

这是一些在我的机器上复制问题的代码:

require(foreach)
require(doSNOW)
cl<-makeCluster(5) 
registerDoSNOW(cl)
for(stepi in 1:10)  # normal outer for
{
  foreach(rc=1:5) %dopar% # the time consuming stuff in parallel (not looking to actually retrieve any data)
  {
    aRandomCounter = -1
    if(1 > 0)
    {
      for(batchi in 1:20) 
      {
        anObjectIwantToCreate <- foreach( qrc = 1:100, .combine=c ) %do% 
        {
          return(runif(1)) # I know this is not efficient, it is a placeholder to reproduce the issue
        }
        aRandomCounter = aRandomCounter + sum(anObjectIwantToCreate > 0.5)
      } 
    }
    return(aRandomCounter)
  }
}
stopCluster(cl)

foreach用简单的foror替换内部(l/s)apply是一种解决方案。但是有没有办法让它与内部一起工作foreach,为什么首先会出现错误?

4

2 回答 2

3

当然,我一发布它就让它工作(对不起......我会留下它以防其他人有同样的问题)。这是一个范围问题 - 我知道您必须在 .xml 中加载任何外部包%dopar%,但我没有意识到这包括foreach包本身。这是解决方案:

require(foreach)
require(doSNOW)
cl<-makeCluster(5) 
registerDoSNOW(cl)
for(stepi in 1:10)  # normal outer for
{
  foreach(rc=1:5) %dopar% # the time consuming stuff in parallel (not looking to actually retrieve any data)
  {
    require(foreach) ### the solution
    aRandomCounter = -1
    if(1 > 0) 
    {
      for(batchi in 1:20) 
      {
        anObjectIwantToCreate <- foreach( qrc = 1:100, .combine=c ) %do% 
        {
          return(runif(1))
        }
        aRandomCounter = aRandomCounter + sum(anObjectIwantToCreate > 0.5)
      } 
    }
    return(aRandomCounter)
  }
}
stopCluster(cl)
于 2014-12-31T21:20:32.677 回答
0
  • 我知道这是一个过时的问题,但只是为了给那些没有嵌套 foreach 工作的人一个提示。
  • 如果用 put 并行化外循环,则%do% in %dopar%需要包含.packages = c("doSNOW")在外循环的扩充中(%dopar%),否则会"doSNOW not found"出错。
  • 通常,人们只是并行化内循环(%dopar% in %:%),这对于大量数据(等待内循环的组合)可能会很慢。
于 2020-12-08T16:44:52.693 回答