简单地说,我正在尝试使用斯诺将我的整个脚本并行化为日期,但是不断地得到下面的错误。
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
(而不是并行化)在两个日期内全部运行,这告诉我,导致并行化失败的不是代码中的bug。
最初,我认为(根据经验)对日期的并行是失败的,因为代码中有另一个函数使用并行化,但是我随后重新构建了整个代码,以确保没有这样的函数。
我用一个很好的梳子把剧本翻了一遍,看看是否有什么地方我无意中没有出口到我需要的东西,我什么也找不到。
关于什么可能导致代码失败的一些想法是:
fOptions
和rquantlib
中的应用sock
类型的使用我知道this问题和this问题,虽然第一个问题对我有帮助,但它还没有帮助解决问题。(注意:这可能是因为我没有正确地使用它,主要是使用loginfo("text")
来跟踪代码的位置。有可能,有一种方法可以改变这种情况,使我可以记录警告和/或错误消息?)
请告诉我,如果有任何其他信息,我可以提供,以帮助解决这一问题。如果有人能提供一些指导,我会非常感激,因为代码运行一天需要将近40分钟,而我需要运行它将近一年,因此并行化是必不可少的!
编辑
我试图通过使用文件外选项来执行上述第一个问题中的建议。考虑到我使用的是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)
。
发布于 2016-06-07 00:39:08
我张贴这个答案,以防它帮助其他人在未来有类似的问题。
本质上,错误unserialize(socklist[[n]])
并没有告诉您太多,所以要解决这个问题,就需要缩小问题范围。
outfile = "Log.txt"
,使您使用的集群函数,例如,cl<-makeCluster(cores-1, outfile="Log.txt")
。然后在函数中添加尽可能多的打印(“Point in code")注释,以缩小问题发生的范围。在我的例子中,问题在于行jj = closeAllConnections()
。这一行在非并行中工作良好,但在并行时会破坏代码。我怀疑这与关闭所有连接(包括并行化所需的套接字连接)有关。
https://stackoverflow.com/questions/37020943
复制相似问题