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

JK_*_*own 5 parallel-processing foreach r

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

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

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
Run Code Online (Sandbox Code Playgroud)

此错误是间歇性的.内存很丰富(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
Run Code Online (Sandbox Code Playgroud)

UPDATE

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

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

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

Big*_*ats 5

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

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

R中的doParallel错误:serialize(data,node $ con)错误:写入连接时出错

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

registerDoParallel(cl)
Run Code Online (Sandbox Code Playgroud)

它通常在事后才起作用,但是我确实注意到,即使有以下情况,任务管理器中的先前多核会话也不会消失:

stopCluster(cl)
Run Code Online (Sandbox Code Playgroud)

这就是为什么我有时重新启动R的原因。


小智 5

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

从使用切换stopCluster(cl)stopImplicitCluster() 为我工作。从我的阅读来看,这应该在使用“一行”registerDoParallel(cores=x)

cl<-makeCluster(x)
registerDoParallel(cl)
Run Code Online (Sandbox Code Playgroud)

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

我会发表评论,但这是(提示带)我的第一个 STACKOVERFLOW 帖子!!!