Colab内存不足无法打开3GB大GeoTIFF文件运行崩溃求解决方案
3GB GeoTIFF在Colab读取时内存不足的解决方法
核心问题原因:当前代码直接将整幅栅格的单通道全量读入numpy数组,3GB的未压缩数组直接加载会占满Colab免费版的可用RAM,触发程序崩溃。以下是可落地的解决方法:
- 方法1:分块读取计算统计值,避免全量加载
利用rasterio的窗口读取能力,逐块遍历栅格计算均值,不需要把整个数组加载进内存,内存占用仅和单块大小挂钩,完全不会爆内存。
示例代码:
import numpy as np import rasterio from rasterio.plot import show import os import matplotlib.pyplot as plt import gc %matplotlib inline fp = "/content/drive/MyDrive/LINEasia/test2.tif" sum_total = 0 count_total = 0 with rasterio.open(fp) as raster: # 按rasterio默认的块大小遍历 for ij, window in raster.block_windows(1): # 只读取当前窗口内的nir波段数据 nir_block = raster.read(1, window=window) sum_total += nir_block.sum() count_total += nir_block.size # 及时释放块内存 del nir_block gc.collect() # 计算全图均值 nir_mean = sum_total / count_total print(nir_mean) print(type(raster))
- 方法2:降采样后读取用于可视化
可视化不需要用到全分辨率的栅格,你可以指定输出尺寸降采样后读取,仅需要几MB到几十MB的内存即可完成可视化:
with rasterio.open(fp) as raster: # 降采样到宽度1000像素,高度按比例计算 out_shape = (int(raster.height / (raster.width / 1000)), 1000) # 降采样读取nir波段,使用双线性重采样保证显示效果 nir_downsampled = raster.read(1, out_shape=out_shape, resampling=rasterio.enums.Resampling.bilinear) show(nir_downsampled, cmap='terrain')
- 方法3:可选的运行时优化
你可以切换Colab的高RAM运行时:点击菜单栏「代码执行程序」-「更改运行时类型」,在弹出的窗口中勾选「高RAM」(免费用户配额足够时可使用,内存可提升到25GB左右),运行代码前可先重启运行时释放之前占用的内存。
另外你原代码里os.path.join(data_dir, "/content/drive/MyDrive/LINEasia/test2.tif")的写法存在问题,第二个参数为绝对路径时前面的data_dir参数会被直接忽略,可以删掉冗余的data_dir变量。
内容的提问来源于stack exchange,提问作者supun nayake
相关产品推荐
相关产品推荐

