.parallel=TRUE
在对其中一个函数的调用中指定时plyr
,即使第一次评估已经抛出错误,它也会顽固地评估所有实例:
doMC::registerDoMC()
plyr::llply(rep(FALSE, 100000), stopifnot, .parallel=TRUE)
上面的例子在我的机器上运行了将近一分钟,途中产生了一些进程。如果.parallel=TRUE
省略,则立即退出。
有没有办法在llply
遇到第一个错误时立即退出?
.parallel=TRUE
在对其中一个函数的调用中指定时plyr
,即使第一次评估已经抛出错误,它也会顽固地评估所有实例:
doMC::registerDoMC()
plyr::llply(rep(FALSE, 100000), stopifnot, .parallel=TRUE)
上面的例子在我的机器上运行了将近一分钟,途中产生了一些进程。如果.parallel=TRUE
省略,则立即退出。
有没有办法在llply
遇到第一个错误时立即退出?
不,恐怕这是不可能的。尽早关闭并行操作并不容易,因为它通常需要在进程之间进行大量复杂的协调,即使在没有出现任何问题的情况下也会减慢操作速度,并且大多数人认为这是不可取的。此外,通常情况下,如果出现问题,所有任务都会出错,因此提前退出也无济于事。但是,当您确实需要它时,您无法想象为什么不实施它。
更新
我与 krlmlr 讨论了修改“doMC”包以使用该功能的修改版本的可能性,该mclapply
功能将在发生错误时立即退出。但是,“doMC”包现在使用“parallel”包而不是“multicore”包(应 R-core 的要求),并且“parallel”不导出实现所需的低级功能mclapply
,例如mcfork
,mckill
和selectChildren
。如果它们是通过:::
运营商使用的,那么修改后的包将不会被 CRAN 接受。
但是,我确实修改了“doMC”,以便在错误处理设置为“stop”时快速检查错误,以避免在发生错误时调用 combine 函数的开销。我的测试表明,这确实提高了这个问题中使用的示例的性能,尽管没有mclapply
发生错误后立即退出的效果那么好。“doMC”的新版本是 1.3.2,在(希望)提交给 CRAN 之前在 R-forge 上进行测试。