parApply 中的错误处理(在 R 中,使用并行包)

bok*_*kov 2 parallel-processing r try-catch

我正在尝试解决尝试使用包parApply中的函数时收到的以下消息parallel

Error in unserialize(node$con) : error reading from connection
Run Code Online (Sandbox Code Playgroud)

以下是我正在做的事情的模型:

c0<-makeCluster(16,outfile='');clusterEvalQ(c0,library(survival));
aa <- array(rexp(1e4),c(100,50,2));
bb<-parApply(c0,aa,1,function(ii) {
  oo<-try(summary(coxph(Surv(c(ii))~gl(2,50)))$coef[1,]);
  if(class(oo)[1]=='try-error') rep(NA,5) else oo
});
Run Code Online (Sandbox Code Playgroud)

...除了它不会产生错误。我从 parApply 内部调用的实际函数是一个我自己编写的巨大函数,太长了,无法在这里发布。但我并不是想让别人调试我的功能。我试图找出在哪里可以找到更详细的调试信息,以及我必须扼杀谁/什么才能try()实现其既定目的。

该函数确实适用于标准apply()和 ,aaply(...,.parallel=FALSE)但不适用于aaply(...,parallel=TRUE)

我在屏幕日志上看到的唯一内容(除了加载我使用的包时附带的正常警告消息)是Execution halted.

当我这样做时,stopCluster(c0)我会得到以下附加输出:

Error in serialize(data, node$con) : ignoring SIGPIPE signal

有人知道还能去哪里看吗?我在 CentOS 版本 5.4(最终版)上运行 R 2.15.1。尽管我尝试用 捕获错误,但是否有一些类型的错误可以向上传播try()?我可以设置一些超时选项parallel以使工作节点更有耐心吗?


首先,我开始使用makeCluster(16,outfile='',type='FORK')默认的 SOCK 类型集群来代替。这变得更加稳定,因为 FORK 克隆了整个环境,而我不记得手动导出每个依赖项和/或因为(这里不确定)FORK 不必通过环回端口发送标记化数据?

无论如何,在某些情况下它们error reading from connection会回来。我被不熟悉的问题域和模糊的错误消息分散了注意力,忘记了同样的故障排除启发法一如既往地适用于这里:

  • 相同的数据总是会产生问题吗?对我来说,是的,而且它总是发生在数据集的同一区域。
  • 重现问题所需的数据集的最低特征是什么?输入数据的连续细分揭示了导致问题的确切列。直接对该向量调用目标函数也会引发问题,这次是在正常的 R 环境中。逐行浏览目标函数揭示了失败的地方。

事实证明,正如回答者所暗示的那样,try()只能捕获错误。错误的数据类型或错误的大小或为 NULL 的意外结果将直接通过try()tryCatch()导致任何尝试将结果放回数组的操作崩溃!

感谢上帝,这不是一些疯狂的非确定性竞争条件或其他什么。呜呜。感谢您的阅读,希望我的经验对其他人有帮助。

Ste*_*ton 5

您使用该功能可能没有任何问题try。您的函数可能导致工作进程退出。在这种情况下,主进程将从与该工作进程的套接字连接读取时出错,从而导致错误消息:

Error in unserialize(node$con) : error reading from connection
Run Code Online (Sandbox Code Playgroud)

parApply不会捕获此错误,但会传播它,导致脚本退出并显示消息“执行已停止”。

我可以通过以下方式重现这个场景:

library(parallel)
cl <- makePSOCKcluster(4)
clusterApply(cl, 1:10, function(i) {
  tryCatch({
    quit(save='no', status=1)
  },
  error=function(e) {
    NULL
  })
})
Run Code Online (Sandbox Code Playgroud)

当我执行它时,我得到输出:

Error in unserialize(node$con) : error reading from connection
Calls: clusterApply ... FUN -> recvData -> recvData.SOCKnode -> unserialize
Execution halted
Run Code Online (Sandbox Code Playgroud)

不幸的是,这并没有告诉我们什么导致工作进程退出,但我认为这就是您应该集中精力的地方,而不是与该try功能作斗争。