在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)
以下是我的问题,
不平行:
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个列表,那么你应该有很多方法来保持所有内核的繁忙,而不用担心嵌套并行。 你更可能伤害你的表现,而不是帮助它,而且似乎没有必要。
上一篇: parallel processing in R using snow
下一篇: How can I directly pass a process from local R to an Amazon EC