【问题标题】:Use a raster Stack in foreach loop with doParallel in R在 foreach 循环中使用光栅堆栈和 R 中的 doParallel
【发布时间】: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(或类似名称)。

标签: r foreach raster


【解决方案1】:

看来packages前面的.不见了。这对我有用:

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

【讨论】:

    【解决方案2】:

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

    # 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-07
      • 2016-05-09
      • 2020-07-13
      • 2021-09-16
      • 1970-01-01
      • 2015-03-17
      • 2017-10-19
      • 2020-10-02
      相关资源
      最近更新 更多