我有一段代码可以迭代3D数组。对于每个x
,y
,函数接受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
作为自己的工作单元(在这种情况下,并行化开销接缝可以淹没利益)。
答案 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)
}