我似乎无法在互联网上找到有关此问题的任何帮助。
我正在使用' 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)
}
答案 0 :(得分:0)
我设法让它发挥作用。我不得不重写我是如何调用这个函数的。最初,我通过一个sapply函数调用它。
sapply(names(amodels), analyze.features, newdata=test.data, newoutcomes=test.outcomes)
由于只有5个模型,我将它们从sapply中取出,并为每个模型连续调用一次analyze.features。工作完成没有错误。我真的不知道为什么;我猜它与sapply函数中的并行化有关。