我是并行化新手,我想改进我的代码的当前版本的并行化,看看是否可以缩短时间。我有 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())
不太清楚你的意思是从内部 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)
}