关于利用GDAL RasterIo()连续读取大影像内存泄漏问题

3.5G遥感影像为例:

 

作为菜鸟遇到的问题:对代码进行跟踪检查发现RasterIo()读取3.5G遥感影像的时候内存逐次增长,虽然每次循环都释放了当前块的内存,但是仍无法回落到处理这一块之前的值,直到最终释放GDALDataset指针,内存才会回落至打开文件前的值(内存占用最高2.4G)。内存的不断增长显然对处理大文件会产生致命问题!究其原因,每执行一次RasterIO内存都会(不太慢的)增长,以致于每一块处理完后内存不彻底回落。尝试每次处理完后删除当前的RasterBand指针也无法回落。

解决方法:

1、      使用RasterIO()对大图像进行分块操作。RasterIO()函数能够对图像任意指定区域任意波段的数据按指定数据类型,指定排列方式读入内存和写入文件中,因此可以实现对大影像的分块读,运算,写操作。对于大图像处理,按照传统方法,首先要将图像所有数据读入内存中,进行相应操作后,再一次性将处理好的数据写入文件中,这样需要耗费很大内存,容易内存溢出,而且存续可执行行差。采用分块处理技术,一幅1G的影像,在整个数据处理过程中,可以只占用几十兆的内存,而且运算量不会增加。

2、      循环调用RasterIo()读取图像时都执行一次打开文件和关闭文件释放RasterDataset指针的操作。这样做内存的开销极小,但频繁的打开关闭文件总是不太好。

希望各位大神能提出更好的解决方案!!!

转载自:https://blog.csdn.net/Mr_YZL_1992/article/details/79184762

You may also like...

退出移动版