2

我正在尝试对尝试使用包中的parApply函数时收到的以下消息进行故障排除parallel

Error in unserialize(node$con) : error reading from connection

以下是我正在做的模型:

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
});

...除了它不会产生错误。我从 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()崩溃任何试图将结果重新放入数组的内容!

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

4

1 回答 1

5

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

Error in unserialize(node$con) : error reading from connection

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

我可以通过以下方式重现这种情况:

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

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

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

不幸的是,这并没有告诉我们是什么导致工作进程退出,但我认为这就是你应该集中精力的地方,而不是在try函数上苦苦挣扎。

于 2013-05-15T23:01:57.140 回答