我需要知道R并行套接字集群的每个结果的任务编号

时间:2015-02-19 02:48:08

标签: r parallel-processing

我在使用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

由于随机时间变量,我无法知道结果来自哪个任务。

有谁知道我如何获得这些信息?

2 个答案:

答案 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