【问题标题】:R Parallelisation Error unserialize(socklisk[[n]])R并行化错误反序列化(socklisk [[n]])
【发布时间】: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


    【解决方案1】:

    我发布此答案,以防将来遇到类似问题的其他人有所帮助。

    基本上,错误unserialize(socklist[[n]]) 并不能告诉您很多信息,因此要解决它,只需缩小问题范围即可。

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

    就我而言,问题出在jj = closeAllConnections() 行。这条线在非并行时工作正常,但在并行时会破坏代码。我怀疑它与关闭所有连接的函数有关,包括并行化所需的套接字连接。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这看起来更像是一条评论
      猜你喜欢
      • 2014-02-19
      • 2018-09-24
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多