在foreach循环中使用栅格堆栈,在R中使用doParallel

时间:2015-05-20 06:20:51

标签: r foreach raster

我想对R中的大型光栅堆栈中的每个图层执行一系列计算,并将每个图层的结果保存为单独的栅格供以后使用。我正在尝试使用foreach和doParallel来加速这个过程。这是基本代码,对堆栈中的每一层进行简单的计算(* 3):

library(raster)
library(doParallel)

RasterStack<- stack(system.file("external/rlogo.grd", package="raster")) 
RasterStack<-addLayer(RasterStack,RasterStack)

cl <- makeCluster(2)
registerDoParallel(cl)

RasterStack<- stack(system.file("external/rlogo.grd", package="raster")) 
RasterStack<-addLayer(RasterStack,RasterStack)

foreach(rasname=iter(names(RasterStack)),packages="raster") %dopar%{
  ras<-RasterStack[[rasname]]*3
  save(ras,file=paste0(rasname,"_new.Rras"))
}

它主要起作用,但不处理前N层,其中N是节点数(例如上面的2)。我收到以下错误:{:任务1失败 - “此S4类不是子集表”中的错误。这个错误大多只发生在所有其他层都被正确处理之后(即它只有前N个层不起作用,这主要是不会阻止正在处理的其他层 - 尽管偶尔会这样做)。如果使用%do%顺序运行,则所有图层都会得到正确处理 任何人都可以解释这种行为,或提供解决方案吗? 感谢

2 个答案:

答案 0 :(得分:4)

似乎只有.前面的packages丢失了。这对我有用:

foreach(rasname = iter(names(RasterStack)), .packages = "raster") %dopar% {
  ras <- RasterStack[[rasname]] * 3
  save(ras, file = paste0(rasname, "_new.Rras"))
}

答案 1 :(得分:0)

如果您希望将结果放到新堆栈中,而不是放在单独的文件中:

# libraries
library(raster)
library(doParallel)

# fake data
RasterStack1 <- stack(system.file("external/rlogo.grd", package="raster")) 
RasterStack1 <- addLayer(RasterStack1, RasterStack1)
plot(RasterStack1)

# make cluster
cl <- makeCluster(2)
registerDoParallel(cl)

# parallel loop
RasterStack2 <- foreach(rasname=iter(names(RasterStack1)), 
                    .packages="raster") %dopar% {
RasterStack1[[rasname]]*3
}

# make result a stack
RasterStack2 <- stack(RasterStack2)
plot(RasterStack2)

# stop cluster
stopCluster(cl)