我正在尝试解决尝试使用时收到的以下消息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
});
... except它不会产生错误。我从 parApply 内部调用的实际函数是一个我自己编写的巨大函数,太长了,无法在这里发布。但我并不是想让别人调试我的功能。我试图找出在哪里可以找到更详细的调试信息以及我必须扼杀谁/什么才能获得try()
以实现其既定目的。
功能does按标准工作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()
and tryCatch()
并崩溃任何试图将结果放回到数组中的东西!
感谢上帝,这不是一些疯狂的非确定性竞争条件或其他什么。呜呜。感谢您的阅读,希望我的经验对其他人有帮助。