首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R并行化错误未序列化(socklisk[[n]])

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

Stack Overflow用户
提问于 2016-05-04 07:18:04
回答 2查看 4.6K关注 0票数 5

简单地说,我正在尝试使用斯诺将我的整个脚本并行化为日期,但是不断地得到下面的错误。

代码语言:javascript
运行
复制
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, ...)’

我以下列方式设置了并行化过程:

代码语言:javascript
运行
复制
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可能看起来像

代码语言:javascript
运行
复制
> dateSeries
  marketDate
1 2016-04-22
2 2016-04-26

MainCalcFunction是一个很长的脚本,它包含我自己的多个函数。由于脚本的复制时间太长,所以它是不切实际的,一个假设的小函数将无法达到这个目的,因为我已经有了这个方法来处理其他较小的函数。我可以说,在MainCalcFunction中,我调用我的所有库、必要的函数和包含除上述导出的变量之外的所有其他变量的文件,这样我就不必导出长列表库和其他对象。

MainCalcFunction可以使用adply (而不是并行化)在两个日期内全部运行,这告诉我,导致并行化失败的不是代码中的bug。

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

我用一个很好的梳子把剧本翻了一遍,看看是否有什么地方我无意中没有出口到我需要的东西,我什么也找不到。

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

  • 各种期权定价函数在fOptionsrquantlib中的应用
  • sock类型的使用

我知道this问题和this问题,虽然第一个问题对我有帮助,但它还没有帮助解决问题。(注意:这可能是因为我没有正确地使用它,主要是使用loginfo("text")来跟踪代码的位置。有可能,有一种方法可以改变这种情况,使我可以记录警告和/或错误消息?)

请告诉我,如果有任何其他信息,我可以提供,以帮助解决这一问题。如果有人能提供一些指导,我会非常感激,因为代码运行一天需要将近40分钟,而我需要运行它将近一年,因此并行化是必不可少的!

编辑

我试图通过使用文件外选项来执行上述第一个问题中的建议。考虑到我使用的是Windows,我在导出关键对象和运行MainCalcFunction之前包括了以下行:

代码语言:javascript
运行
复制
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开始时,在我的库和函数来源之后,我包括了以下要打印到文件的内容:

代码语言:javascript
运行
复制
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)

EN

Stack Overflow用户

发布于 2016-06-07 00:39:08

我张贴这个答案,以防它帮助其他人在未来有类似的问题。

本质上,错误unserialize(socklist[[n]])并没有告诉您太多,所以要解决这个问题,就需要缩小问题范围。

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

在我的例子中,问题在于行jj = closeAllConnections()。这一行在非并行中工作良好,但在并行时会破坏代码。我怀疑这与关闭所有连接(包括并行化所需的套接字连接)有关。

票数 6
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37020943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档