我想对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%顺序运行,则所有图层都会得到正确处理 任何人都可以解释这种行为,或提供解决方案吗? 感谢
答案 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)