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

R并行化错误未序列化(socklisk[[n]]),r,parallel-processing,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>: ..

简言之,我正在尝试使用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, ...)’
MainCalcFunction
是一个非常长的脚本,其中包含我自己的多个函数。由于脚本的复制时间太长,因此不实用,而假设的小函数将无法实现此目的,因为我已经使用此方法来处理其他较小的函数。我可以说,在
MainCalcFunction
中,我调用了我所有的库、必要的函数以及一个包含除上述导出变量之外的所有其他变量的文件,这样我就不必导出一长串库和其他对象

MainCalcFunction
可以使用
adply
在2个日期内全部成功运行,但不能并行化,这告诉我导致并行化失败的不是代码中的错误

起初,我认为(根据经验),由于代码中有另一个函数使用了并行化,所以随着时间的推移并行化失败了,但是我随后重新构建了整个代码,以确保没有这样的函数

我把剧本仔细地梳理了一遍,看看是否有什么地方我不小心没有输出我需要的东西,我什么也找不到

关于可能导致代码失败的原因,以下是一些想法:

  • fooptions
    rquantlib
  • 类型
    sock
我知道已经有人问过这个问题,也有人问过这个问题,虽然第一个问题帮助了我,但它并没有帮助解决这个问题。(注意:这可能是因为我没有正确使用它,主要是使用了
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)
maincalc函数
函数中,我将
loginfo(“text”)
语句放在关键点,以通知我代码的位置


这导致在由于上述错误导致代码失败后,某些文本文件可用。但是,这些文本文件除了在哪一点上提供错误原因的更多信息外,没有提供其他信息。尽管在
MainCalcFunction
中嵌入了
tryCatch
语句,但在最后,对于任何错误实例,我都添加了一行
logerror(e)

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

本质上,错误
unserialize(socklist[[n]])
不会告诉您很多,因此要解决它,需要缩小问题的范围

  • 首先,绝对确保代码以非并行方式在多个日期上运行,没有错误
  • 确保并联设置正确。许多其他问题都会回答一些明显的初始错误,例如,代码中隐藏的并行化,这意味着并行化会发生两次

  • 一旦确定代码没有问题并且并行化设置正确,就开始缩小范围。这个问题很可能是(除非上面遗漏了什么)代码中的某个东西,当它以串行方式运行时不是问题,但当以并行方式运行时会成为问题。缩小范围的最简单方法是设置您使用的make cluster函数中的
    outfile=“Log.txt”
    ,例如,
    cl尝试使用普通R运行,而不是在RStudio中运行。

    这看起来更像是一个注释
    > dateSeries
      marketDate
    1 2016-04-22
    2 2016-04-26
    
    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)
    
    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 = ""))