【问题标题】:Error in parallel R: Error in serialize(data, node$con) : error writing to connection并行 R 中的错​​误:序列化错误(数据,node$con):写入连接时出错
【发布时间】:2018-01-04 21:55:13
【问题描述】:

我已经看过一些关于这个主题的其他帖子,但似乎没有一个与我遇到的问题完全相同。但这里是:

我正在使用并行运行一个函数

cores <- detectCores() cl <- makeCluster(8L,outfile="output.txt") registerDoParallel(cl) x <- foreach(i = 1:length(y), .combine='list',.packages=c('httr','jsonlite'), .multicombine=TRUE,.verbose=F,.inorder=F) %dopar% {function(y[i])}

这通常工作正常,但现在抛出错误:

序列化错误(数据,节点$con):写入连接时出错

检查 output.txt 文件后,我看到:

starting worker pid=11112 on localhost:11828 at 12:38:32.867
starting worker pid=10468 on localhost:11828 at 12:38:33.389
starting worker pid=4996 on localhost:11828 at 12:38:33.912
starting worker pid=3300 on localhost:11828 at 12:38:34.422
starting worker pid=10808 on localhost:11828 at 12:38:34.937
starting worker pid=5840 on localhost:11828 at 12:38:35.435
starting worker pid=8764 on localhost:11828 at 12:38:35.940
starting worker pid=7384 on localhost:11828 at 12:38:36.448
Error in unserialize(node$con) : embedded nul in string: '\0\0\0\006SYMBOL\0\004\0\t\0\0\0\003')'\0\004\0\t\0\0\0\004expr\0\004\0\t\0\0\0\004expr\0\004\0\t\0\0\0\003','\0\004\0\t\0\0\0\024SYMBOL_FUN'
Calls: <Anonymous> ... doTryCatch -> recvData -> recvData.SOCKnode -
unserialize
Execution halted

此错误是间歇性的。内存充足(32GB),内存中没有其他大型 R 对象。并行代码中的函数从云端检索一些小的 json 数据对象并将它们放入一个 R 对象中——因此没有大数据文件。我不知道为什么它偶尔会看到嵌入的 nul 并停止。

我也有一个从云中提取 csv 文件的函数的类似问题。到目前为止,这两个函数在 R 3.3.0 和 R 3.4.0 下都可以正常工作。

我在 Windows 上使用 R 3.4.1 和 RStudio 1.0.143。

这是我的会话信息

sessionInfo()
R version 3.4.1 (2017-06-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United 
States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] parallel  stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] RJSONIO_1.3-0     RcppBDT_0.2.3     zoo_1.8-0         data.table_1.10.4 
doParallel_1.0.10 iterators_1.0.8  
[7] RQuantLib_0.4.2   foreach_1.4.3     httr_1.2.1       

loaded via a namespace (and not attached):
[1] Rcpp_0.12.12     lattice_0.20-35  codetools_0.2-15 grid_3.4.1       
R6_2.2.2         jsonlite_1.5     tools_3.4.1     
[8] compiler_3.4.1

更新

现在我得到另一个类似的错误:

反序列化错误(node$con): ReadItem:未知类型100,可能是更高版本的R写的

嵌入的 nul 错误似乎已经消失。我还尝试删除 .Rhistory 和 .Rdata 并删除我的包子文件夹并重新加载所有 pacakges。至少这个新错误似乎是一致的。我找不到“未知类型 100”是什么。

【问题讨论】:

  • 也许您的环境中有大型对象在集群上导出?尝试将此 foreach 调用放在它自己的函数中。
  • 这似乎不是问题——我实际上删除了环境中所有无关的对象。
  • 你能用function 重现问题吗?
  • 希望可以,但function 使用公司内部信息...。我已经使用此设置几个月了,现在突然出现此错误...。

标签: r foreach parallel-processing


【解决方案1】:

我收到类似的错误...通常发生在后续脚本运行时,当我以前的脚本之一出错或我提前停止它时。这可能是您提到的部分:“我不知道为什么它偶尔会看到嵌入的 nul 并停止”,这可能是错误。

这有一些很好的信息,特别是要确保为常规 Windows 进程运行保留 1 个核心。还提到“如果您从其中任何一个函数中得到错误,通常意味着至少有一个工人已经死亡”,这可以支持我关于错误后崩溃的理论。

doParallel error in R: Error in serialize(data, node$con) : error writing to connection

到目前为止,我的解决方案是通过再次运行来重新初始化并行后端:

registerDoParallel(cl)

它通常在之后工作,但我确实注意到我的任务管理器中以前的多核会话并没有消失,即使:

stopCluster(cl)

这就是我有时会重启 R 的原因。

【讨论】:

  • 是的,即使在stopCluster(cl) 之后,我也遇到过内核没有停止的问题。我会尝试重新初始化后端。我尝试将常规 Windows 进程的内核数量减少 1,但这似乎没有帮助。
  • 我刚刚再次尝试了代码并且它运行了 - 但这是过去 15 次尝试中的第一次。这次输出文件没有任何问题。但很难建立信心.....
  • 再尝试三次都失败了。重新启动 R、减少内核和重新初始化并行后端都没有帮助。
【解决方案2】:

我还注意到多核会话不会离开任务管理器。

从使用切换:stopCluster(cl) 到stopImplicitCluster() 为我工作。根据我的阅读,这应该在使用“单行”registerDoParallel(cores=x) 时使用 与

cl<-makeCluster(x)
registerDoParallel(cl)

我的“直觉”是 Windows 处理集群的方式需要 stopImplicitCluster,但您的体验可能会有所不同。

我会发表评论,但这是(提示乐队)我的第一个堆栈溢出帖子!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多