我有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)
以下是我的问题,
不平行:
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)中并行化lapply
custom.function <-function(x)parLapply(clus,x $ z,function(y)(forecast :: ets(y)))##不起作用
非常感谢您的帮助
问题在于该forecast
程序包未加载到群集工作器上,这会导致错误lapply
地遍历ts
对象。您可以forecast
使用clusterEvalQ
以下方法加载工作人员:
clusterEvalQ(clus, library(forecast))
为了回答您的第二个问题,您尝试嵌套嵌套的方式失败了,因为工作人员尚未snow
加载或clus
定义。但是,如果您有1000个列表,则应该有很多方法可以使所有内核保持繁忙,而不必担心嵌套并行性。您更有可能损害自己的表现而不是有所帮助,而且这似乎没有必要。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句