R 中的并行化

问题描述 投票:0回答:1

我是并行化新手,我想改进我的代码的当前版本的并行化,看看是否可以缩短时间。我有 4 个栅格和一个包含 9000 个特征的 shapefile。我希望每个栅格对 9000 个要素中的每一个要素执行平均值。

我可以通过使用核心来使用

mclapply
对每个栅格执行操作来进行并行化。我总共使用了 4 个核心。但是,我有更多可用的核心,我还想在剩余的核心中划分不同的功能。例如,一个核心运行第一个栅格中 3000 个要素的平均值,第二个核心运行其他 3000 个要素的平均值,然后继续...

有人可以提供一些如何做的建议吗?

这是我当前的代码:

library(terra)
library(stringr)
library(dplyr)

irr <- function(x) {

      g <-  terra::vect("prueba.SHP")
      ra <-  rast(x)

      val <- c()
      df <- data.frame()
      
         for (i in 1:nrow(g)) {
               
            d <- terra::extract(ra, g[i],exact = TRUE) 
            d2 <- d1 %>% group_by(ID) %>% summarize(ss = sum(fraction * d1[,2])) 
            val <- c(val,d2)
                    
         }
      
       df <- data.frame("perc_ir_agr"=val)
       write.csv(df,paste(str_sub(x,end=-5),".csv",sep=""))
   
}

ff <-parallel::mclapply(list.files(pattern="\\.tif$"),irr, mc.cores=parallel::detectCores())
r for-loop parallel-processing raster doparallel
1个回答
0
投票

不太清楚你的意思是从内部 for 循环中获取什么,d2 肯定是一个 data.frame 吗?使用 c(val, d2) 收集 data.frame 可能无法最好地实现您最初想要的功能。

也许您可以让代码为您工作。

library(terra)
library(stringr)
library(dplyr)
library(purrr)
library(furrr)

g <-  terra::vect("prueba.SHP")

irr <- function(x) {

    ra <-  rast(x)

    segments <- cut(seq_len(nrow(g), parallel::detectCores()))
    slevels <- levels(segments)

    l <- future_map( slevels, function(level) {

        rows_to_process <- which(segments == level)

        map( rows_to_process, function(i) {
            d1 <- terra::extract(ra, g[i], exact = TRUE)
            d1 %>% group_by(ID) %>% summarize(ss = sum(fraction * d1[,2]))
        }) %>% list_rbind()

    })

    val <- list_rbind(l)
    df <- val %>% rename(perc_ir_agr="ss")
    write.csv(df,paste(str_sub(x,end=-5),".csv",sep=""))

}

for(tif_file in list.files(pattern="\\.tif$")) {
    irr(tif_file)
}


© www.soinside.com 2019 - 2024. All rights reserved.