首页 > 解决方案 > 如何在这个 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)
}

标签: rarraysforecastingdoparallelinventory-management

解决方案


你快到了。您需要做的就是并行执行,如下所示

# 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函数。


推荐阅读