You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:23:32