1

.parallel=TRUE在对其中一个函数的调用中指定时plyr,即使第一次评估已经抛出错误,它也会顽固地评估所有实例:

doMC::registerDoMC()
plyr::llply(rep(FALSE, 100000), stopifnot, .parallel=TRUE)

上面的例子在我的机器上运行了将近一分钟,途中产生了一些进程。如果.parallel=TRUE省略,则立即退出。

有没有办法在llply遇到第一个错误时立即退出?

4

1 回答 1

2

不,恐怕这是不可能的。尽早关闭并行操作并不容易,因为它通常需要在进程之间进行大量复杂的协调,即使在没有出现任何问题的情况下也会减慢操作速度,并且大多数人认为这是不可取的。此外,通常情况下,如果出现问题,所有任务都会出错,因此提前退出也无济于事。但是,当您确实需要它时,您无法想象为什么不实施它。

更新

我与 krlmlr 讨论了修改“doMC”包以使用该功能的修改版本的可能性,该mclapply功能将在发生错误时立即退出。但是,“doMC”包现在使用“parallel”包而不是“multicore”包(应 R-core 的要求),并且“parallel”不导出实现所需的低级功能mclapply,例如mcforkmckillselectChildren。如果它们是通过:::运营商使用的,那么修改后的包将不会被 CRAN 接受。

但是,我确实修改了“doMC”,以便在错误处理设置为“stop”时快速检查错误,以避免在发生错误时调用 combine 函数的开销。我的测试表明,这确实提高了这个问题中使用的示例的性能,尽管没有mclapply发生错误后立即退出的效果那么好。“doMC”的新版本是 1.3.2,在(希望)提交给 CRAN 之前在 R-forge 上进行测试。

于 2013-11-13T17:19:00.667 回答