簡體   English   中英

在 R 中使用 doParallel 在 foreach 循環中使用光柵堆棧

[英]Use a raster Stack in foreach loop with doParallel in R

我想對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% 順序運行,所有層都會得到正確處理。

誰能解釋這種行為,或提供解決方案?
謝謝

似乎只有. 前面的packages不見了。 這對我有用:

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

如果您希望將結果放入新堆棧而不是單獨的文件:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM