我正在尝试对尝试使用包中的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()
崩溃任何试图将结果重新放入数组的内容!
感谢上帝,这不是一些疯狂的非确定性比赛条件或其他什么。呜呜。感谢阅读,希望我的经验对其他人有所帮助。