简而言之,我试图使用Snow和adply在日期上并行化我的整个脚本,但不断得到以下错误。
Error in unserialize(socklist[[n]]) : error reading from connection
In addition: Warning messages:
1: <anonymous>: ... may be used in an incorrect context: ‘.fun(piece, ...)’
2: <anonymous>: ... may be used in an incorrect context: ‘.fun(piece, ...)’
我已按以下方式设置并行化过程:
Cores = detectCores(all.tests = FALSE, logical = TRUE)
cl = makeCluster(Cores, type="SOCK")
registerDoSNOW(cl)
clusterExport(cl, c("Var1","Var2","Var3","Var4"), envir = environment())
exposureDaily <- adply(.data = dateSeries,.margins = 1,.fun = MainCalcFunction,
.expand = TRUE, Var1, Var2, Var3,
Var4,.parallel = TRUE)
stopCluster(cl)
dateSeries
可能看起来像
> dateSeries
marketDate
1 2016-04-22
2 2016-04-26
MainCalcFunction
是一个非常长的脚本,其中包含多个我自己的函数。由于脚本是如此长的复制,它将是不实际的,并且假设的小函数将失败目的,因为我已经使用这种方法与其他较小的函数一起工作。我可以说在MainCalcFunction
内我调用了所有库,必要的函数和包含除上面导出的所有其他变量的文件,这样我就不必导出长列表库和其他对象。
MainCalcFunction
可以使用adply
在2个日期内成功运行但不是并行化,这告诉我代码中的错误不是导致并行化失败。
最初我认为(根据经验)日期的并行化失败了,因为代码中有另一个使用并行化的函数,但是我随后重建了整个代码以确保没有这样的函数。
我用精细的牙齿梳在脚本上,看看是否有任何地方我意外地没有出口我需要的东西,我找不到任何东西。
关于可能导致代码失败的一些想法是:
fOptions
和rquantlib
sock
我知道已经问过this问题以及this问题,虽然第一个问题对我有帮助,但它还没有帮助解决问题。 (注意:这可能是因为我没有正确使用它,主要使用loginfo("text")
来跟踪代码的位置。可能有一种方法可以改变它,以便我记录警告和/或错误消息?)
如果我能提供任何其他信息以帮助解决此问题,请告知我们。如果有人可以提供一些指导,我会非常感激,因为代码需要花费近40分钟来运行一天而且我需要运行它近一年,因此并行化至关重要!
修改
我尝试使用outfile选项在上面提到的第一个问题中实现建议。鉴于我使用的是Windows,我通过在导出关键对象并运行MainCalcFunction
之前包含以下行来完成此操作:
reportLogName <- paste("logout_parallel.txt", sep="")
addHandler(writeToFile,
file = paste(Save_directory,reportLogName, sep="" ),
level='DEBUG')
with(getLogger(), names(handlers))
loginfo(paste("Starting log file", getwd()))
mc<-detectCores()
cl<-makeCluster(mc, outfile="")
registerDoParallel(cl)
同样地,在MainCalcFunction
的开头,在获取了我的库和函数之后,我已经包含以下内容来打印到文件:
reportLogName <- paste(testDate,"_logout.txt", sep="")
addHandler(writeToFile,
file = paste(Save_directory,reportLogName, sep="" ),
level='DEBUG')
with(getLogger(), names(handlers))
loginfo(paste("Starting test function ",getwd(), sep = ""))
在MainCalcFunction
函数中,我在关键接口处放置了loginfo("text")
语句,告诉我代码的位置。
由于上述错误导致代码失败后,这导致一些文本文件可用。但是,除了在什么时候,这些文本文件不再提供有关错误原因的更多信息。尽管在tryCatch
中嵌入了MainCalcFunction
语句,但最后,在任何错误实例中我添加了行logerror(e)
答案 0 :(得分:3)
我发布这个答案,以防将来遇到类似问题的其他人。
基本上,错误unserialize(socklist[[n]])
并没有告诉你很多,所以要解决它,这就是缩小问题范围的问题。
outfile = "Log.txt"
您使用的群集功能,例如cl<-makeCluster(cores-1, outfile="Log.txt")
。然后在函数中添加尽可能多的打印(“Point in code”)注释,以缩小问题发生的位置。在我的情况下,问题是行jj = closeAllConnections()
。此行在非并行时工作正常但在并行时会破坏代码。我怀疑它与关闭所有连接的功能有关,包括并行化所需的套接字连接。
答案 1 :(得分:0)
尝试使用普通 R 运行,而不是在 RStudio 中运行。