Rasterio栅格化大尺寸图像失败,调整GDAL缓存无效的解决咨询
我用以下代码将多边形栅格化到大型栅格中:
import rasterio.features from shapely.geometry import Polygon p1 = Polygon([[0,0], [32000,0], [32000,32000], [0,0]]) out_shape = (32000, 32000) # 默认transform没问题 r = rasterio.features.rasterize([p1], out_shape=out_shape)
当栅格尺寸较小(比如out_shape=(10000,10000))时,操作能在数秒内完成,但设置为(32000,32000)就失败了。
查了rasterio.features.rasterize的文档,里面提到:
If GDAL max cache size is smaller than the output data, the array of shapes will be iterated multiple times. Performance is thus a linear function of buffer size. For maximum speed, ensure that GDAL_CACHEMAX is larger than the size of out or out_shape.
我尝试用以下代码调整GDAL_CACHEMAX:
from osgeo import gdal max_gdal_cache_gb=64 gdal.SetCacheMax(int(max_gdal_cache_gb * 1e9))
但问题依然存在,而且不确定GDAL_CACHEMAX是否真的调整成功了,该怎么解决?
1. 先验证GDAL缓存是否生效
先确认GDAL_CACHEMAX是否成功设置,在调用gdal.SetCacheMax后,用gdal.GetCacheMax()查看实际值:
from osgeo import gdal max_gdal_cache_gb = 64 gdal.SetCacheMax(int(max_gdal_cache_gb * 1e9)) print(f"当前GDAL缓存最大值: {gdal.GetCacheMax() / 1e9} GB")
如果输出和设置的64GB不符,可能是环境限制(比如系统内存不足,GDAL自动调整了缓存上限),或者代码执行顺序有问题(要确保在调用rasterize前设置缓存)。
2. 分块处理大栅格
如果系统内存不足以支撑全尺寸栅格的一次性处理,可将大栅格分成多个小块分别栅格化,再拼接起来:
import rasterio.features from shapely.geometry import Polygon import numpy as np p1 = Polygon([[0,0], [32000,0], [32000,32000], [0,0]]) out_shape = (32000, 32000) block_size = 8000 # 分块大小,可根据内存调整 # 初始化结果数组 result = np.zeros(out_shape, dtype=np.uint8) # 遍历每个分块 for y in range(0, out_shape[0], block_size): for x in range(0, out_shape[1], block_size): # 计算分块的实际范围(避免超出边界) y_end = min(y + block_size, out_shape[0]) x_end = min(x + block_size, out_shape[1]) # 分块的shape block_shape = (y_end - y, x_end - x) # 计算分块对应的transform偏移 block_transform = rasterio.transform.from_origin(x, y_end, 1, 1) # 栅格化当前分块 block = rasterio.features.rasterize([p1], out_shape=block_shape, transform=block_transform) # 将分块写入结果数组 result[y:y_end, x:x_end] = block
3. 检查系统内存与环境限制
32000x32000的uint8数组仅需约1GB内存,但GDAL处理时的临时缓存可能需要更多空间。如果64GB缓存仍无效,检查:
- 系统是否有内存配额限制(比如容器、虚拟机的内存上限)
- 虚拟内存(交换分区)是否开启且足够
- 是否有其他进程占用大量内存
4. 升级GDAL与Rasterio版本
老版本的GDAL或Rasterio可能存在大栅格处理的bug,尝试升级到最新稳定版:
pip install --upgrade rasterio gdal
内容的提问来源于stack exchange,提问作者KarateKid

