【问题标题】:Parallel process list of rasters with focal function and parLapply in RR中具有焦点功能和parLapply的栅格的并行处理列表
【发布时间】:2017-10-13 19:34:00
【问题描述】:

我正在尝试并行处理栅格列表并使用 parLapply 执行焦点函数。我想我误解了一些重要的事情。代码运行,但看起来它没有在我的驱动器上正确写出焦点函数。看起来它在列表中的第一个栅格上执行了两次 Density_Function ......并行处理世界的新手,想知道是否有关于如何处理这个问题的任何建议?顺便说一句,当我运行我的 Density_Function 并使用 lapply 列出时,它可以工作。我如何并行处理这个?

`# Density function
Density_Function <- function (raster_layer){
                    weight <- focalWeight(raster_layer,90,type = "circle")                        
                    raster_name <- names(raster_layer)
                    short_name <- substr(raster_name,1,4)
                    half_output <- "X:/Path"
                    full_output <- paste0(half_output,short_name,"_90m.tif")
                    focal(raster_layer, weight, fun=sum, full_output, na.rm=TRUE, pad=TRUE, NAonly=FALSE, overwrite=TRUE)         
                    }

#Bring in raster data and create list
roads_raster <-raster('X:/roads.tif')
pipe_raster <-raster('X:/pipes.tif')
raster_list <- list(roads_raster,pipe_raster) ` 

#Activate cluster
no_cores <- detectCores() - 1
cl <- makeCluster(no_cores)

#Apply function
parLapply(cl = cl, x = raster_list, fun = Density_Function)

#Close cluster
stopCluster(cl)

【问题讨论】:

  • 你能提供一些小数据来重现这个吗?

标签: r parallel-processing gis raster


【解决方案1】:

我采用了不同的方法,但最终得到了我想要的结果。我没有使用 parLapply,而是使用 foreach 遍历我的栅格列表并并行执行我的密度函数。

这个博客真的很有帮助:http://www.gis-blog.com/increasing-the-speed-of-raster-processing-with-r-part-23-parallelisation/

library(doParallel)   
library(foreach)

#Density function, 1km circular radius
Density_Function_1000 <- function (raster_layer){
  raster_name <- names(raster_layer)
  short_name <- substr(raster_name,1,4)
  weight <- focalWeight(raster_layer,1000,type = "circle")
  half_output <- "X:/Path"
  full_output <- paste0(half_output,short_name,"_1km.tif")
  focal(raster_layer, weight, fun=sum, full_output, na.rm=TRUE, pad=TRUE, NAonly=FALSE, overwrite=TRUE)
  }

#Define how many cores you want to use
UseCores <- detectCores() -1
#Register CoreCluster
cl <- makeCluster(UseCores)
registerDoParallel(cl)

#Create my list of rasters
raster_list <- list(roads_raster, cuts_raster, wells_raster, seis_raster, pipes_raster, fires_raster)

#Use foreach loop and %dopar% command to execute my density function in parallel 
foreach(i = raster_list) %dopar% {
  library(raster)
  Density_Function_1000(i)
  }

#end cluster
stopCluster(cl)  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 2021-12-14
    • 1970-01-01
    • 2015-01-19
    相关资源
    最近更新 更多