使用R、terra和mlr3处理大栅格预测时遇致命错误致会话终止
问题描述
尝试用terra包对大型栅格数据集(10-20波段,大小约3-6GB)进行预测时,R会话频繁因致命错误终止。使用的是mlr3包的自动调优随机森林(ranger)模型,设备配置为32GB内存、Windows 10系统,R版本4.3.2。开启terraOptions(verbose = TRUE)后的预测输出如下:
> pred = terra::predict(multiband_raster, model = autotuner_rf) filename : C:/Users/Dell 3620/AppData/Local/Temp/Rtmpqs4XHf/spat_Oo6ZPX1PfuWIttF_2356.tif compute stats : 1, GDAL: 0, minmax: 0, approx: 1 driver : GTiff disk available: 38.6 GB disk needed : 0.4 GB memory avail. : 28.54 GB memory allow. : 17.12 GB memory needed : 35.93 GB (40 copies) in memory : false block size : 3139 rows n blocks : 4 pb : 3
已知核心问题是内存不足,但仅靠32GB内存,有哪些方法可以完成预测?已尝试使用反射率(0.00–1.00)和DN值(0–10000)的栅格数据,均无改善。
解决方法
调整terra内存限制参数
默认terra仅使用约60%的可用内存,可手动调高比例或直接设置内存上限:# 设为使用80%可用内存 terraOptions(memfrac = 0.8) # 直接设置内存上限为25GB terraOptions(maxmemory = 25)注意不要超过系统实际可用内存,避免系统卡顿。
强制更小的分块处理
当前分块为3139行,可手动指定更小的分块行数,降低单块内存需求:pred = terra::predict(multiband_raster, model = autotuner_rf, chunksize = 1000)也可通过
blockSize计算合适分块后传入:# 每个块最多占用15GB内存 bs = blockSize(multiband_raster, maxmemory = 15) pred = terra::predict(multiband_raster, model = autotuner_rf, chunksize = bs$nrows)优化ranger模型内存占用
自动调优后的模型可能参数导致内存开销大,可尝试:- 降低
num.trees参数(若调优后树数量过多) - 设置
ranger的memory.fraction限制单树内存比例 - 提取调优后的基础模型,直接用其预测减少额外开销:
rf_model = autotuner_rf$model$learner$model pred = terra::predict(multiband_raster, model = rf_model)
- 降低
进一步压缩栅格数据类型
若DN值范围允许,转换为更紧凑的整数类型:# 转换为无符号16位整数(0-65535) multiband_raster_int = terra::as.int(multiband_raster, type = "INT2U") pred = terra::predict(multiband_raster_int, model = autotuner_rf)启用磁盘缓存
让terra将中间结果写入磁盘,减少内存堆积:# 指定有足够空间的临时目录 terraOptions(tempdir = "D:/temp_terra") terraOptions(memfrac = 0.5, diskcache = TRUE)分区域手动处理
将栅格切割为子区域分别预测后拼接:# 切割为4个区域 tiles = terra::makeTiles(multiband_raster, n = 4) # 循环预测每个区域 pred_list = lapply(tiles, function(tile) { terra::predict(tile, model = autotuner_rf) }) # 拼接结果 pred = terra::merge(pred_list)
内容的提问来源于stack exchange,提问作者filrat2
相关产品推荐
相关产品推荐

