我在使用R并行套接字集群时遇到问题,并且函数foreach用于识别哪个结果来自哪个任务。
想象一下以下代码:
require(doParallel)
cl <- makeCluster(4)
registerDoParallel(cl)
raffle <- foreach(i = 1:10, .combine = rbind) %dopar% {
Sys.sleep(0.2 + exp(-3 + rnorm(1,0,0.5)))
sample(1:60, 6, replace = FALSE)
}
stopCluster(cl)
raffle
[,1] [,2] [,3] [,4] [,5] [,6]
result.1 45 28 15 41 21 56
result.2 44 22 32 40 17 26
result.3 28 30 1 4 24 20
result.4 7 60 20 1 40 23
result.5 44 16 5 53 20 31
result.6 35 29 26 15 11 12
result.7 21 12 48 32 36 58
result.8 25 8 34 57 55 6
result.9 1 2 17 33 53 45
result.10 37 36 40 33 6 10
由于随机时间变量,我无法知道结果来自哪个任务。
有谁知道我如何获得这些信息?
答案 0 :(得分:1)
将doParallel
后端与套接字群集一起使用时(如示例所示),使用clusterApplyLB
函数计算任务。这允许负载平衡,但它仍然总是按顺序返回结果,因此您知道结果矩阵的行将按任务ID排序。
有foreach
个并行后端允许结果无序组合,但除非您指定foreach
.inorder=FALSE
选项,否则结果将始终按顺序组合。在这种情况下,您可以在结果中包含任务ID。在您的示例中,您可以使用:
r <- foreach(i = 1:10, .combine = rbind, .inorder=FALSE) %dopar% {
Sys.sleep(0.2 + exp(-3 + rnorm(1,0,0.5)))
c(i, sample(1:60, 6, replace = FALSE))
}
tasks <- r[,1]
raffle <- r[,-1]
在一个更复杂的示例中,您可以返回任务ID并生成列表,然后使用自定义组合函数来处理任务ID。但正如我所说,在使用doParallel
后端时,这在技术上是不必要的。
答案 1 :(得分:1)
感谢。我想到了一种获得完成顺序的方法。
require(doParallel)
cl <- makeCluster(4)
registerDoParallel(cl)
r <- foreach(i = 1:10, .combine = rbind, .inorder = FALSE, .final = data.frame) %dopar% {
Sys.sleep(0.2 + 10 / i)
c(i, format(Sys.time(), '%H%M%OS6'), sample(1:60, 6, replace = FALSE))
}
stopCluster(cl)
r <- r[order(r[, 2]), ]
r[, 2] <- 1:nrow(r)
names(r) <- c('taskID', 'completionOrder', 1:6)
r