在R中使用雪并行处理

我有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。 所以我试图使用雪包和本网站中显示的示例。

  ## 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)

以下是我的问题,

  • 出于某种原因,对于非并行版本,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
    
  • 我的第二个问题是我应该如何平行化自定义函数中的lapply,基本上是一个嵌套的parLapply

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

  • 非常感谢您的帮助


    问题在于forecast软件包未加载到导致lapply地遍历ts对象的群集工作者上。 您可以使用clusterEvalQ加载对工作人员的forecast

    clusterEvalQ(clus, library(forecast))
    

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

    链接地址: http://www.djcxy.com/p/53425.html

    上一篇: parallel processing in R using snow

    下一篇: How can I directly pass a process from local R to an Amazon EC