1

何千ものリストがあり、各リストには複数の時系列があります。リスト内の各要素に予測を適用したいと思います。これは、コンピューティング リソースの観点から、扱いにくい問題になっています。私は、並列コンピューティングや高度な R プログラミングのバックグラウンダーを持っていません。どんな助けでも大歓迎です。

ダミーリストを作成しました。基本的に、dat.list は私が取り組んでいるものと似ています。

library("snow")
library("plyr")
library("forecast")

    ## Create Dummy Data

    z <- ts(matrix(rnorm(30,10,10), 100, 3), start = c(1961, 1), frequency = 12)
    lam <- 0.8
    ap <- list(z=z,lam=lam)

## forecast using lapply

    z <- ts(matrix(rnorm(30,10,10), 100, 3), start = c(1971, 1), frequency = 12)
    lam <- 0.5
    zp <- list(z=z,lam=lam)

    dat.list <- list(ap=ap,zp=zp)

    xa <- proc.time()
    tt <- lapply(dat.list,function(x) lapply(x$z,function(y) (forecast::ets(y))))
    xb <- proc.time()

上記のコードは、必要なものを提供します。上記のコードで両方のlapplyに並列処理を適用したいと思います。そこで、snow パッケージとこのサイトに示されている例を使用しようとしました。

  ## Parallel Processing


    clus <- makeCluster(3)
    custom.function <- function(x) lapply(x$z,function(y) (forecast::ets(y)))
    clusterExport(clus,"custom.function")

    x1 <- proc.time()
    tm <- parLapply(clus,dat.list,custom.function)
    x2<-proc.time()

    stopCluster(clus)

以下は私の質問です、

  1. 何らかの理由で、tm の出力は、非並列バージョンでは異なります。予測関数 ets は、リスト内の要素ではなく、すべての単一のデータ ポイントに適用されます。

非平行:

summary(tt)
   Length Class  Mode
ap 3      -none- list
zp 3      -none- list

パラレルバージョン:

    summary(tm)
       Length Class  Mode
    ap 300    -none- list
    zp 300    -none- list
  1. 私の2番目の質問は、カスタム関数でlapplyをどのように並列化する必要があるかです。基本的にはネストされたparLapplyです

    custom.function <- function(x) parLapply(clus,x$z,function(y) (forecast::ets(y))) ## 動作しない

助けてくれて本当にありがとうございます

4

1 に答える 1

1

問題は、forecastパッケージがクラスター ワーカーに読み込まれていないため、オブジェクトが正しくlapply反復処理されないことです。以下を使用してワーカーにtsロードできます。forecastclusterEvalQ

clusterEvalQ(clus, library(forecast))

snow2 番目の質問に答えるために、ワーカーがロードまたはclus定義されていないため、ネストされた並列処理の試みは失敗しました。しかし、何千ものリストがある場合は、ネストされた並列処理を気にせずにすべてのコアをビジー状態に保つ方法がたくさんあるはずです。パフォーマンスを向上させるよりも、パフォーマンスを低下させる可能性が高く、その必要はないようです。

于 2014-12-16T15:56:49.387 に答える