【发布时间】:2018-07-13 12:34:51
【问题描述】:
我正在尝试使用foreach 和%dopar% 运行一个函数,该函数将在每次迭代时将其结果传递回自身。下面的小例子:
require(doParallel)
test_function <- function(data)
{
result <- rbind(data, data)
return(result)
}
test_data <- mtcars
cl <- makeCluster(4)
registerDoParallel(cl)
results <- foreach(i = 1:10) %dopar%
{
aa <- test_function(test_data)
aa$iteration <- i
test_data <- aa
return(aa)
}
stopCluster(cl)
我希望在results 中看到的是一个包含十个数据帧的列表,每个数据帧的行数依次加倍。
似乎在 foreach 函数中重新定义 test_data 并没有这样做,就像我只是在标准 for 循环中运行这些命令一样 - 就像这样:
results <- list()
for(i in 1:10)
{
aa <- test_function(test_data)
aa$iteration <- i
test_data <- aa
results[[i]] <- aa
}
如果能深入了解我在这里所忽略的内容,将不胜感激。
【问题讨论】:
-
我不知道你真正的问题是什么,但你要在这里做的事情本质上是连续的。也就是说,第一次运行应该完成它的工作,然后第二次运行,依此类推。它不能并行完成。
-
是的,我现在看到了。该序列实际上是跨多个处理器并行完成的,这没有意义 b/c 1 需要在 2 开始之前完成。谢谢!
-
顺便说一句,要禁用
foreach的并行能力,使用%do%代替%dopar%就足够了。 -
使用并行 bc 测试我需要它来解决我的实际问题,现在我意识到这里发生了什么,我需要重新考虑。
标签: r foreach doparallel