使用terra::extract处理海量点与多层栅格堆栈时遇std::bad_alloc错误
terra::extract双线性插值时遭遇std::bad_alloc内存不足问题
对超过270万个点坐标,在包含2880层(每层仅100个像元)的SpatRaster堆栈上执行双线性terra::extract操作时,触发Error: std::bad_alloc错误,推测为内存不足导致。
曾尝试将堆栈转为列表后用lapply逐序处理,但基于前两层的基准测试,该方法耗时过长,因此寻求其他解决方案。原以为terra会自动分块处理,遂尝试调整内存参数,但未成功触发分块。
可复现代码
library(terra) library(data.table) r <- rast(nrow = 10, ncol = 11, ext = c(-130.3125, -109.6875, 45.625, 58.125), resolution = c(1.875, 1.25), crs = "EPSG:4326") r[] <- runif(n = ncell(r)) stk <- eval(parse(text = paste0("rast(list(", paste(rep("r", 2880), collapse = ", "), "))"))) xyz <- data.table(x = sample(seq(-130.3125, -109.6875, by = 0.0001), size = 2785518, replace = TRUE), y = sample(seq(45.625, 58.1255, by = 0.00001), size = 2785518, replace = TRUE)) tester <- extract(stk, xyz, method = "bilinear") # Error: std::bad_alloc
内存参数调整尝试
尝试设置terraOptions(memmax = 0.1, memmin = 0.1)触发分块处理,但mem_info显示堆栈仍以单块加载,错误依旧:
> mem_info(stk) ------------------------ Memory (GB) ------------------------ check threshold : 1 (memmin) available : 23.98 allowed (60%) : 14.39 needed (n=1) : 0 ------------------------ proc in memory : TRUE nr chunks : 1 ------------------------ > terraOptions(memmax = 0.1, memmin = 0.1) > mem_info(stk) ------------------------ Memory (GB) ------------------------ check threshold : 0.1 (memmin) available : 0.1 (memmax) allowed (60%) : 0.06 needed (n=1) : 0 ------------------------ proc in memory : TRUE nr chunks : 1 ------------------------
尝试方案及更新
- 更新1:参考建议尝试提取唯一像元位置再关联回所有点,但双线性提取结果与直接提取所有点不一致
- 更新2:单图层测试确认上述差异,推测是点的权重影响双线性插值结果
- 更新3:拆分SpatRaster分块处理的方案有效,但后续
rbind合并表格时仍出现内存不足,此为非terra相关问题
内容的提问来源于stack exchange,提问作者Ceres
相关产品推荐
相关产品推荐

