如何解决使用PCRaster的pcr2numpy转换栅格时出现的numpy MemoryError问题
报错真实成因
这个numpy.core._exceptions.MemoryError的本质是当前Python进程的可用内存不足以分配目标数组,具体诱因如下:
- 多次调用
pcr2numpy生成和栅格尺寸一致的完整numpy数组,数组使用后未及时释放,内存持续占用累计后,本次分配时可用空间不足 - 代码中
ifthen(allpoints, newpointts)这类未赋值的中间运算结果也会临时占用内存,进一步挤压可用空间
两个待选方案的有效性判断
数组使用完成后立即删除
有效,是性价比最高的优化手段。你可以在数组不再被调用的位置用del删除变量,再主动触发垃圾回收释放内存,参考修改逻辑:
import gc allpoints = cover(firstpoints1,secondpoints) allpoints2 = ifthen(allpoints,self.upstreamup) array1 = pcr2numpy(allpoints2,np.nan) # 提取array1非NaN值后立即释放原数组 array10 = array1[~np.isnan(array1)] del array1 gc.collect() array2 = pcr2numpy(ifthen(allpoints, newpointts),np.nan) # np.nanmean会自动忽略NaN,不需要array20的话可直接删除该步骤 meann = np.nanmean(array2) array20 = array2[~np.isnan(array2)] del array2 gc.collect()
使用含更多NaN值的数组
无效。不管数组内存储的是有效值还是NaN,同shape、同数据类型的numpy数组占用的内存空间完全一致,float32类型每个元素固定占用4字节,不会因为值为NaN减少内存占用。
额外优化建议
- 删掉冗余计算:
np.nanmean原生支持自动跳过NaN值,不需要提前提取非NaN值的子集,减少不必要的临时数组生成 - 如果后续处理的栅格尺寸持续增大,可改用分块读取处理的逻辑,不需要一次性加载完整栅格到内存中
内容的提问来源于stack exchange,提问作者Nikolay Yasinskiy
相关产品推荐
相关产品推荐

