【发布时间】:2021-09-30 08:34:52
【问题描述】:
我可能做错了,但这就是我想要做的...... 我有两个需要纠正的大栅格。由于 R 只在一个核心上工作,我想使用并行处理。因此,我将两个栅格拆分为较小的栅格,我想在这些栅格上执行我的任务。之后我会将较小的栅格合并为一个。
我的问题是,在foreach 循环中,应该创建新对象 - 我将它们保存到列表中。但是列表仍然是空的。
library(raster)
library(rgdal)
library(SpaDES)
library(doParallel)
dmp <- raster("exampe1.tif"))
luc <- raster("example2.sdat"))
UseCores <- parallel::detectCores()-1 #Define how many cores you want to use
cl <- makeCluster(UseCores) #Register CoreCluster
registerDoParallel(cl)
dmp_s <- splitRaster(dmp, nx= 10, ny = 10) #Split raster to smaller rasters
luc_s <- splitRaster(luc, nx= 10, ny = 10) #Split raster to smaller rasters
dmp_s_copy <- dmp_s
luc_s_copy <- luc_s
dmp1 <- vector(mode = 'list', length = length(dmp_s))
m <- vector(mode = 'list', length = length(dmp_s))
dmp2 <- vector(mode = 'list', length = length(dmp_s))
dmp_list <- vector(mode = 'list', length = length(dmp_s))
dmp_stack <- vector(mode = 'list', length = length(dmp_s))
dmp_final1 <- vector(mode = 'list', length = length(dmp_s))
foreach(i=1:length(dmp_s)) %dopar% {
dmp1[i] <- dmp_s[[i]] * luc_s[[i]]
m[[i]] <- matrix(1, ncol=5, nrow=5)
dmp2[[i]] <- raster::focal(dmp1[[i]], w=m[[i]], fun=max, na.rm=TRUE, pad=TRUE, NAonly=TRUE)
dmp_list[[i]] <- list(dmp_s[[i]], dmp2[[i]])
dmp_stack[[i]] <- stack(dmp_list[[i]])
dmp_final1[[i]] <- min(dmp_stack[[i]])
}
dmp_final <- mergeRaster(dmp_final1)
如果我不使用并行处理,代码可以工作,但我需要它。如何让它发挥作用?
【问题讨论】:
-
你需要研究一下 foreach 包的小插曲。
foreach循环与for循环根本不同,它更类似于lapply循环。在并行处理期间,工作人员无法访问主 R 进程的全局环境。您需要重写循环体,使其具有可以传递给主 R 进程并由其组合的返回值。 -
你也可以试试
terra::focal。这可能会加快速度(而且您不必担心边缘效应)。
标签: r parallel-processing raster r-raster doparallel