并行等效于“应用”在R

时间:2017-08-23 20:28:54

标签: r foreach parallel-processing

我有一段代码可以迭代3D数组。对于每个xy,函数接受z值的堆栈并生成不同的堆栈。这可以通过以下方式完成:

result_data <- apply(data, c(1,2), fun)

我想使用foreach将其并行化。我尝试了很多这样的结构变体:

result <- foreach(i= 1:nrow(a), .combine=rbind) %dopar% {
  apply(a[i,,], 1, identity)
}

在每次迭代中,输出数组都以某种方式与apply的结果不同(值重新排列,维度更改等)

我可以使用apply重现原始foreach来电的行为吗?

注意:我尝试了parApply包中的parallel,但我更喜欢使用foreach的解决方案,我可以按行对数据进行分块,而不是考虑每个x,y作为自己的工作单元(在这种情况下,并行化开销接缝可以淹没利益)。

2 个答案:

答案 0 :(得分:2)

iterators包中包含iapply函数,可用于并行应用操作。它避免了使用更少的内存将整个阵列发送给每个工作人员。

例如:

redim <- function(r) {
  dim(r) <- c(4,2,3)
  r
}

result <- foreach(x=iapply(a, c(1,2)), .combine='c', .final=redim) %dopar% {
  fun(x)
}

请注意,这会使用redim函数将结果转换为正确的尺寸。

答案 1 :(得分:1)

例如,如果您想要等效于apply(a, c(1, 2), identity),则可以使用

result <- foreach(i = 1:ncol(a), .final = simplify2array) %dopar% {
  apply(a[, i, ], 1, identity)
}