【问题标题】:Modifying Variables within a Foreach loop?在 Foreach 循环中修改变量?
【发布时间】:2013-02-15 20:51:20
【问题描述】:

我正在尝试构建一个并行的 for-each 循环来修改两个矩阵。我在开始循环之前创建并初始化矩阵。这是一个虚拟程序,它演示了我的代码应该如何工作。程序执行没有错误,但在 foreach 循环完成后矩阵仍然为空。注意:这是我的代码的简化版本,而不是实际代码本身。

#Assume that I've loaded parallel and doParallel and that my computer has 2+ cores 
cluster <- makeCluster(detectCores())
registerDoParallel(cluster)
a1 <- array(dim=c(9,9))
a2 <- array(dim=c(9,9))
numbers <- 1:18
foreach (i=1:9, .combine='c') %dopar%{
    a1[i,] = numbers[1:9]
    a2[i,] = numbers[10:18]
}
stopCluster(cluster)

为什么这个程序不填充 a1 和 a2 的行?

编辑:我在之前的任何帖子中都找不到我的问题的答案。 C# 和 Perl 也有类似的线程,但没有一个与 R 相关。

【问题讨论】:

  • 我认为这只是a2[i,] = numers[10:18]这一行的拼写错误,将numers更改为numbers
  • @agstudy,我检查了我的程序,没有错字。但是,我的帖子中有一个错字,所以感谢您发现它!

标签: r foreach parallel-processing


【解决方案1】:

您不能使用 foreach 来执行这种副作用。循环中的分配发生在工作进程中,并且故意不发送回主进程。你执行 foreach 是为了它的返回值,所以如果你想生成两个矩阵,foreach 应该返回一个包含两个矩阵的列表。

这是一个示例,它使用组合函数从工作人员生成的行列表中构造多个矩阵:

rcomb <- function(...) {
  args <- list(...)
  lapply(seq_along(args[[1]]), function(i)
         do.call('rbind', lapply(args, function(a) a[[i]])))
}

numbers <- 1:18
m <- foreach (i=1:9, .combine='rcomb', .multicombine=TRUE) %dopar% {
    list(numbers[1:9], numbers[10:18])
}

虽然rcomb 有点复杂,但它可以处理任意数量的矩阵,并且可以调用许多任务结果,这对效率来说很重要。

【讨论】:

  • 感谢您的回答。我上个月通过在 foreach 循环中使用 rbind 解决了这个问题。
  • @Xceptional 你也可以提供你的解决方案吗?
【解决方案2】:

也许这会有所帮助。无法测试,请见谅。

 require(snowfall)

sfInit(cpus=2,parallel=TRUE)

a1 <- matrix(NA,ncol=9,nrow=0)
a2 <- matrix(NA,ncol=9,nrow=0)
numbers <- 1:18

a1 = rbind(a1,sfSapply(1:9,function(x) return(numbers[1:9]), numbers))
a2 = rbind(a2,sfSapply(1:9,function(x) return(numbers[10:18]), numbers))

sfStop()

【讨论】:

  • 谢谢,但我不能用这个。我的实际代码要复杂得多,需要一个 for-each 循环。在我将任何变量添加到 a1 和 a2 之前,已经发生了许多计算。
  • 是否可以将这些计算包装在一个函数中,然后使用 SF(L/S)apply 调用它?考虑在集群内进行计算,获取一个列表/向量作为输出并将其强制转换为外部的数据结构。
  • 更新:我尝试了您的代码并收到以下错误:“checkForRemoteErrors(val) 中的错误:2 个节点产生错误;第一个错误:未使用的参数 (1:18)”我'我在“snow”和“parallel”中尝试其他应用功能,但它们似乎都没有工作。
猜你喜欢
  • 2012-08-02
  • 2010-12-01
  • 2011-09-11
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
相关资源
最近更新 更多