R:Parallel和data.table unserialize(节点$ con)中的错误:从连接读取错误

时间:2018-04-13 20:01:55

标签: r parallel-processing data.table

注意:我已将问题修复到我的代码现在运行的位置,但我不知道为什么这个解决方案有效。任何反馈都很棒。请参阅下面的编辑。

我遇到了并行包的问题,​​我认为是data.table。昨晚,我的代码工作正常。但是,现在我收到了这个错误:

Error in unserialize(node$con) : error reading from connection. 

除了相同的断言失败,重复no_core次,其中no_cores是我在群集中使用的核心数:

Assertion failure at kmp_runtime.cpp(6480): __kmp_thread_pool == __null.
OMP: Error #13: Assertion failure at kmp_runtime.cpp(6480).
OMP: Hint: Please submit a bug report with this message, compile and run commands used, and machine configuration info including native compiler and operating system versions. Faster response will be obtained by including all program sources.

由于我的代码昨晚工作,我倾向于认为我有一些软件包的组合允许我的代码工作,因为我试图使用多个软件包来进行一些数据操作。但现在我的代码不再需要这些包,所以我没有包含" library()"我的代码中的陈述。

我正在使用并行程序包来提高我反复调用模拟分布时刻的函数的速度。我调用的函数使用data.table来估计这些时刻。下面是我认为相关的所有代码,并且与我的实际脚本的顺序相同。

library(data.table)
library(parallel)
Rcpp::sourceCpp('mycppcode.cpp')
nsim=100
no_cores = detectCores()-1

objective_fun = function(theta_guess, dmoments = data_moments){
  set.seed(100)
  moment.list = parLapply(cl,1:nsim,function(x) {est.moments(theta_guess)})
  moment.mat = matrix(unlist(moment.list),ncol=nsim)
  mean.moments = apply(moment.mat,1,mean)
  outval = as.numeric(t(mean.moments-dmoments)%*%(mean.moments-dmoments))
  outval
}

cl = makeCluster(no_cores,type = "FORK")
test = constrOptim(guess,objective_fun,grad=gradient_obj,
        ui=diag(11),ci=rep(0,11),method = "BFGS")

est.moments函数使用data.table来计算复杂的均值和方差。我只是真正使用data.table(),setkey()和merge()。

是的,我在定义目标函数后创建了集群。我可能做错了,因为我对并行包相对较新。

唯一值得一提的是我也在使用Rcpp来创建某些功能,尽管C ++代码可以自行编译和运行。

编辑:如果我在代码的最开头创建一个集群,然后在结束时停止它,然后重新制作它,我的代码运行正常。我做错了什么?

library(data.table)
library(parallel)
Rcpp::sourceCpp('mycppcode.cpp')
nsim=100
no_cores = detectCores()-1
cl = makeCluster(no_cores,type = "FORK")

objective_fun = function(theta_guess, dmoments = data_moments){
  set.seed(100)
  moment.list = parLapply(cl,1:nsim,function(x) {est.moments(theta_guess)})
  moment.mat = matrix(unlist(moment.list),ncol=nsim)
  mean.moments = apply(moment.mat,1,mean)
  outval = as.numeric(t(mean.moments-dmoments)%*%(mean.moments-dmoments))
  outval
}

stopCluster(cl)
cl = makeCluster(no_cores,type = "FORK")
test = constrOptim(guess,objective_fun,grad=gradient_obj,
        ui=diag(11),ci=rep(0,11),method = "BFGS")

注意:我删除了会话信息,因为我觉得它不再相关。

1 个答案:

答案 0 :(得分:0)

由于内存问题,类似的错误发生在我身上。看来您的并行计算需要更多可以由系统支持的RAM。