1

我有 1000 个列表,每个列表都有多个时间序列。我想将预测应用于列表中的每个元素。就计算资源而言,这已成为一个棘手的问题。我没有并行计算或高级 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. 我的第二个问题是我应该如何在自定义函数中并行化 lapply,基本上是嵌套的 parLapply

    custom.function <- function(x) parLapply(clus,x$z,function(y) (forecast::ets(y))) ## 不工作

非常感谢您的帮助

4

1 回答 1

1

问题是该forecast包未加载到集群工作人员上,这导致错误lapply地迭代ts对象。您可以使用以下方法加载forecast工人clusterEvalQ

clusterEvalQ(clus, library(forecast))

要回答您的第二个问题,您对嵌套并行的尝试失败了,因为工作人员没有snow加载或clus定义。但是,如果您有 1000 个列表,那么您应该有很多方法可以让所有内核保持忙碌,而不必担心嵌套并行性。你更有可能伤害你的表现而不是帮助它,而且这似乎没有必要。

于 2014-12-16T15:56:49.387 回答