使用foreach并行子集化terra包SpatVector时出错求助
问题解决方法
问题根源
并行子进程无法访问全局环境中的vector对象,subset函数找不到有效输入,触发NULL相关错误。
解决方案1:显式导出全局对象到子进程
修改foreach调用,添加.export = "vector"参数,让每个并行任务都能获取到vector对象:
# Libraries library(terra) library(foreach) library(doParallel) # Example vector vector <- vect(system.file("ex/lux.shp", package="terra")) aoi <- vector$NAME_2 # Set up cluster threads <- 4 cl <- makeCluster(threads) registerDoParallel(cl) # Parallel loop - 添加.export参数 extraction <- foreach(i = 1:length(aoi), .packages = c("terra"), .inorder = F, .export = "vector") %dopar% { IDoi <- aoi[i] tile_vector <- subset(vector, NAME_2 == IDoi, NAME_2, NSE = TRUE) } # Stop cluster stopCluster(cl) gc()
解决方案2:预先拆分要素,避免子进程内子集化
更高效的方式是先把vector拆分为单个要素的列表,直接遍历列表,省去子进程里的subset操作:
# Libraries library(terra) library(foreach) library(doParallel) # Example vector vector <- vect(system.file("ex/lux.shp", package="terra")) # 拆分为单个要素的列表 vector_list <- lapply(1:nrow(vector), function(x) vector[x, ]) # Set up cluster threads <- 4 cl <- makeCluster(threads) registerDoParallel(cl) # Parallel loop - 直接遍历要素列表 extraction <- foreach(single_poly = vector_list, .packages = c("terra"), .inorder = F) %dopar% { # 这里可以直接使用single_poly进行后续栅格提取操作 # 比如:extract(raster_tile, single_poly) single_poly } # Stop cluster stopCluster(cl) gc()
内容的提问来源于stack exchange,提问作者J. Antonio Guzmán Q.
相关产品推荐
相关产品推荐

