{:任务1524失败 - “无法打开连接”出错

时间:2014-10-20 01:15:33

标签: r foreach parallel-processing

我似乎无法在互联网上找到有关此问题的任何帮助。

我正在使用' foreach'并行运行一个函数。和' doParallel'包。此函数将训练模型和两个数据帧作为输入,进行预测,然后对其中一个变量进行混洗,并再次进行预测。它计算每个变量的RMSE并返回在混洗后增加的变量。这需要很长时间,所以我必须并行运行它。即便如此,每个型号仍然需要大约2个小时。

它似乎不是函数代码本身的问题,也许是输入问题,因为我之前运行它没有问题,我在错误后检查了我的日志文件,它处理了所有变量。我有5个模型,我想运行此功能。我先在一个模型上运行它,然后保存结果。现在它起作用了,我想把它应用到其余的模型中。

foreach循环完成处理后似乎出现了问题,因为日志文件表明所有变量都已分析。但我没有得到的是追溯表明错误发生在循环内。

提前感谢您对此问题的任何帮助。如果我不清楚任何事情,请告诉我。我正在运行Windows7和R版本3.1。

这是错误:

Error in { : task 1524 failed - "cannot open the connection" 
10 stop(simpleError(msg, call = expr)) 
9 e$fun(obj, substitute(ex), parent.frame(), e$data) 
8 foreach(variable = names(newdata), .export = c("calc.rmse", "catf", 
    "start.timer", "stop.timer"), .combine = "rbind") %dopar% 
    {
        baseline = NULL ... at feature_selection.R#53
7 FUN(c("pH", "Ca", "P", "Sand")[[1L]], ...) 
6 lapply(X = X, FUN = FUN, ...) 
5 sapply(names(amodels[2:length(amodels)]), analyze.features, newdata = test.data, 
    newoutcomes = test.outcomes) at script.R#59
4 eval(expr, envir, enclos) 
3 eval(ei, envir) 
2 withVisible(eval(ei, envir)) 
1 source("~/%FILEPATH%") 

以下是相关功能的代码:

analyze.features = function(newdata, newoutcomes, model.name) {
   model = amodels[[model.name]]
   file = "data/shuffled_data.csv"

   if(!file.exists(file)) {
      cat("Creating shuffled data frame...\r\n")
      shuffled.data = as.data.frame(sapply(newdata, shuffle))

      cat("Writing shuffled data frame to disk...\r\n")
      write.csv(shuffled.data, file)
   } else {
      cat("Reading shuffled data from file...\r\n")
      shuffled.data = read.csv(file)
   }

   # Send output to a log file.
   writeLines("", "log.txt")

   start.timer("About to enter parallelization...")
   cat("Time is: ", format(Sys.time(), "%a %b %d %X %Y"), "\r\n")

   output = foreach(variable = names(newdata), .export=c("calc.rmse", "catf", "start.timer", "stop.timer"), .combine="rbind") %dopar% {
      baseline = NULL
      shuffle = NULL

      sdata = newdata

      # Write to log file.
      catf("Analyzing ", variable)

      sdata[[variable]] = shuffled.data[[variable]]

      baseline[[variable]] = suppressWarnings(calc.rmse(predict(model, newdata=newdata), newoutcomes))
      shuffle[[variable]]  = suppressWarnings(calc.rmse(predict(model, newdata=sdata), newoutcomes))

      cbind(baseline=baseline, shuffle=shuffle)
   }

   stop.timer("Total time to analyze features")

   save.df(output, paste("RMSE_", model.name, sep=""))

   # Reduce list of kept features.
   keep = row.names(output)[which(output[,2] - output[,1] > 0)]

   rm(output, shuffled.data)
   beep(1)
   return(keep)
}

1 个答案:

答案 0 :(得分:0)

我设法让它发挥作用。我不得不重写我是如何调用这个函数的。最初,我通过一个sapply函数调用它。

sapply(names(amodels), analyze.features, newdata=test.data, newoutcomes=test.outcomes)

由于只有5个模型,我将它们从sapply中取出,并为每个模型连续调用一次analyze.features。工作完成没有错误。我真的不知道为什么;我猜它与sapply函数中的并行化有关。