在 R 中使用 snow 进行并行处理



我有 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()

上面的代码给了我需要的东西。我想在上面的代码中对两者应用平行处理。所以我尝试使用雪包和本网站中显示的示例。

  ## 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. 我的第二个问题是我应该如何在自定义函数,基本上是一个嵌套的parLapply

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

非常感谢您的帮助

问题是 forecast 包未加载到群集工作线程上,这会导致lapply错误地迭代ts对象。您可以使用clusterEvalQ在工作线程上加载forecast

clusterEvalQ(clus, library(forecast))

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

相关内容

  • 没有找到相关文章

最新更新