【发布时间】:2015-05-20 06:20:50
【问题描述】:
我想在 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% 顺序运行,所有图层都会得到正确处理。
谁能解释这种行为或提供解决方案?
谢谢
【问题讨论】:
-
你也可以考虑使用
spatial.tools。 -
请指定您使用的软件包。您提供的代码是否可重现?
-
我正在使用 raster 和 doParallel。我已经编辑了代码,现在可以重现(使用 ?stack 中的徽标示例)。
-
save(ras, file=paste0(rasname,"_new.Rras"))不是将栅格数据存储超过 24 小时的安全方式,因为ras可能指向临时文件。您需要使用writeRaster(或类似名称)。