5

mclapply(X, FUN)遇到 的某些值的错误时X,错误会传播到 的其他一些(但不是全部)值X

require(parallel)
test <- function(x) if(x == 3) stop() else x
mclapply(1:3, test, mc.cores = 2)

#[[1]]
#[1] "Error in FUN(c(1L, 3L)[[2L]], ...[cut]
#
#[[2]]
#[1] 2
#
#[[3]]
#[1] "Error in FUN(c(1L, 3L)[[2L]], ... [cut]

#Warning message:
#In mclapply(1:3, test, mc.cores = 2) :
#  scheduled core 1 encountered error in user code, all values of the job will be affected

我怎样才能阻止这种情况发生?

4

1 回答 1

11

诀窍是设置mc.preschedule = FALSE

mclapply(1:3, test, mc.cores = 2, mc.preschedule = FALSE)
#[[1]]
#[1] 1

#[[2]]
#[1] 2

#[[3]]
#[1] "Error in FUN(X[[nexti]], ...[cut]
#Warning message:
#In mclapply(1:3, test, mc.cores = 2, mc.preschedule = FALSE) :
#  1 function calls resulted in an error

这是因为默认情况下mclapply似乎将 X 分成mc.cores组并将矢量化版本FUN应用于每个组。因此,如果组中的任何成员产生错误,则该组中的所有值都将产生相同的错误(但其他组中的值不受影响)。

设置mc.preschedule = FALSE会产生不利影响,并且可能无法重现伪随机数序列,其中相同的作业总是在序列中接收相同的数字,请参阅?mcparallel标题随机数下。

于 2013-08-20T08:23:34.880 回答