R并行化错误反序列化(socklisk [[n]])

时间:2016-05-04 07:18:05

标签: r parallel-processing

简而言之,我试图使用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个日期内成功运行但不是并行化,这告诉我代码中的错误不是导致并行化失败。

最初我认为(根据经验)日期的并行化失败了,因为代码中有另一个使用并行化的函数,但是我随后重建了整个代码以确保没有这样的函数。

我用精细的牙齿梳在脚本上,看看是否有任何地方我意外地没有出口我需要的东西,我找不到任何东西。

关于可能导致代码失败的一些想法是:

  • fOptionsrquantlib
  • 中使用各种期权估价功能
  • 使用类型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)

2 个答案:

答案 0 :(得分:3)

我发布这个答案,以防将来遇到类似问题的其他人。

基本上,错误unserialize(socklist[[n]])并没有告诉你很多,所以要解决它,这就是缩小问题范围的问题。

  • 首先,绝对确保代码在非并行的几个日期运行,没有错误
  • 确保正确设置并行化。许多其他问题都会出现一些明显的初始错误,例如代码中隐藏的并行化,这意味着并行化发生了两次。
  • 一旦确定代码没有问题并且正确设置了并行化,就开始缩小范围。问题很可能(除非上面遗漏了某些内容)代码中的某些内容在串行运行时不是问题,但在并行运行时会成为问题。缩小范围的最简单方法是设置outfile = "Log.txt"您使用的群集功能,例如cl<-makeCluster(cores-1, outfile="Log.txt")。然后在函数中添加尽可能多的打印(“Point in code”)注释,以缩小问题发生的位置。

在我的情况下,问题是行jj = closeAllConnections()。此行在非并行时工作正常但在并行时会破坏代码。我怀疑它与关闭所有连接的功能有关,包括并行化所需的套接字连接。

答案 1 :(得分:0)

尝试使用普通 R 运行,而不是在 RStudio 中运行。