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

时间:2017-07-28 18:24:41

标签: r foreach parallel-processing

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

我正在使用

并行运行一个函数

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

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

更新

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

  

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

编写

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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

registerDoParallel(cl)

它通常可以在以后工作,但我注意到我的任务管理器中的以前的多核会话不会消失,即使是:

stopCluster(cl)

这就是我有时重启R。

的原因

答案 1 :(得分:3)

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

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

cl<-makeCluster(x)
registerDoParallel(cl)

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

我会评论但这是(提示乐队)我的第一次STACKOVERFLOW POST !!!