【发布时间】:2016-08-29 11:46:57
【问题描述】:
简而言之,我正在尝试使用 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") 语句放在关键时刻,以告知我代码的位置。
这导致由于上述错误导致代码失败后一些文本文件可用。但是,这些文本文件除了在什么时间点之外没有提供有关错误原因的更多信息。尽管在MainCalcFunction 中嵌入了tryCatch 语句,但在最后,在任何错误实例中,我都添加了logerror(e) 行
【问题讨论】:
标签: r parallel-processing