r - 如何在这个 LOOP 中使用“DoParallel”,这需要我 12 小时以上才能运行
问题描述
我目前正在处理此代码。一切都很好,除了...代码需要 12 小时才能完成。
我真的很想更改此代码以使用 Doparallel,但我只是一遍又一遍地失败。我必须使用 Foreach 但它似乎无法提高效率......我不知道如何为这个数组设计一个“并行”,因为我需要这个数组进行进一步分析......
有谁能够帮我?
Data <- read_csv("C:/Users/Desktop/200144.csv")
ourModels <- list("forecast(naive(data),h=h)","forecast(ets(data,model='ANN'),h=h,level=95)", "forecast(ets(data,model='AAN', damped=FALSE),h=h,level=95)"
,"forecast(ets(data,model='MAM', damped=FALSE),h=h,level=95)","forecast(ets(data,model='AAN', damped=TRUE),h=h,level=95)"
,"forecast(ets(data,ic='aicc'),h=h,level=95)","mapa(data,fh=h,conf.lvl=0.95)","forecast(auto.ssarima(data,ic='AICc'),h=h,level=95)")
ourHorizon <- 2 #1,2,6
ourOrigins <- 144-36-ourHorizon + 1 # x rolling origins
ourForecasts <- array (NA,c(ourHorizon,ourOrigins,length(ourModels),ncol(Data)))#max origin, max horizon, how many time series.
ourHoldoutValues <- array (NA,c(ourHorizon,ourOrigins,ncol(Data)))#max origin, max horizon, how many time series.
EMTable<-array (NA,c(ncol(Data),length(ourModels),3))#3 metrics
RMSETABLE<-array (NA,c(1,ourOrigins,length(ourModels),ncol(Data)))
#collect forecasting results and Standard deviation of past forecasting errors
foreach(a = 1:ncol(Data))%do% {# a is the No. of time series
foreach(b = 1:8)%do%{# b is the No. of the models
ourData <- as.data.frame(Data [,a])
#ourData <- na.omit(ourData)
ourData <- ts(ourData,frequency=12) #monthly data
#Change Models here:
ourCall <- ourModels[[b]]
if (b==7){#MAPA
ourValue <- c("outfor","MSE")
} else if (b==8){#SARIMA
ourValue <- c("mean","model$lossValue")
} else if (b==1){
ourValue <- c("mean","model$sigma2")}#?????
else
ourValue <- c("mean","model$mse")
ourROReturn <- ro(ourData, h=ourHorizon, origins=ourOrigins, call=ourCall, parallel = TRUE,
value=ourValue, ci=FALSE, co=TRUE)
if (b==7){#MAPA is special
ourForecasts[,,b,a] <- ourROReturn$outfor
ourHoldoutValues[,,a] <- ourROReturn$holdout
#measure forecasting performances here #MPE
EMTable[a,b,1]<-mean(apply(((ourROReturn$holdout - ourROReturn$outfor) / ourROReturn$holdout),1,mean,na.rm=TRUE))#MPE
RMSETABLE[,,b,a]<-(ourROReturn$MSE)^0.5
} else{#use ourreturn$model can get their INSAMPLE MSE
ourForecasts[,,b,a] <- ourROReturn$mean
ourHoldoutValues[,,a] <- ourROReturn$holdout
EMTable[a,b,1]<-mean(apply(((ourROReturn$holdout - ourROReturn$mean) / ourROReturn$holdout),1,mean,na.rm=TRUE))#MPE
RMSETABLE[,,b,a]<-(ourROReturn$model)^0.5}
}
print(a)
}
解决方案
你快到了。您需要做的就是并行执行,如下所示
# load libraries
library(parallel)
library(doParalle)
# create parallel cluster
cl <- makeCluster(9,timeout=120)
doParallel::registerDoParallel(cl)
getDoParWorkers()
## Your parallel for loop
#collect forecasting results and Standard deviation of past forecasting errors
foreach(a = 1:ncol(Data), .packages=c(any packages you need inside for loop)) %dopar% {
....
....
....
....
}
如果想进一步提高执行时间,把第二个foreach循环foreach(b = 1:8)%do%{
做成函数,使用apply
函数。
推荐阅读
- python - 通过 pyinstaller 将带有 google json 文件和 kivy 的 python 文件编译成 exe
- python - 将excel转换为html表格同时保留excel单元格格式的方法
- java - 在春季获取当前的 mongo 用户角色
- javascript - 如何使 npm 实时服务器在 vs 代码中工作?
- javascript - javascript document.createTextNode 返回
- python - 一次在多个图中循环绘制并在最后一次迭代中保存它们
- visual-studio - 我无法在 MAUI 安装期间修复这些错误
- oracle - Oracle 将管道功能合并到工作过程中
- python - Keras conv1D 中 model.fit 的 ValueError(预期 min_ndim=3,发现 ndim=2)
- redis - 自定义redis数据目录