我有 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)
以下是我的问题,
- 由于某种原因,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
我的第二个问题是我应该如何在自定义函数,基本上是一个嵌套的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 个列表,那么您应该有很多方法来保持所有内核的忙碌,而不必担心嵌套并行性。你更有可能损害你的表现而不是帮助它,这似乎没有必要。