关于利用GDAL RasterIo()连续读取大影像内存泄漏问题
2018-01-28 09:26
501 查看
以3.5G遥感影像为例:
作为菜鸟遇到的问题:对代码进行跟踪检查发现RasterIo()读取3.5G遥感影像的时候内存逐次增长,虽然每次循环都释放了当前块的内存,但是仍无法回落到处理这一块之前的值,直到最终释放GDALDataset指针,内存才会回落至打开文件前的值(内存占用最高2.4G)。内存的不断增长显然对处理大文件会产生致命问题!究其原因,每执行一次RasterIO内存都会(不太慢的)增长,以致于每一块处理完后内存不彻底回落。尝试每次处理完后删除当前的RasterBand指针也无法回落。
解决方法:
1、 使用RasterIO()对大图像进行分块操作。RasterIO()函数能够对图像任意指定区域任意波段的数据按指定数据类型,指定排列方式读入内存和写入文件中,因此可以实现对大影像的分块读,运算,写操作。对于大图像处理,按照传统方法,首先要将图像所有数据读入内存中,进行相应操作后,再一次性将处理好的数据写入文件中,这样需要耗费很大内存,容易内存溢出,而且存续可执行行差。采用分块处理技术,一幅1G的影像,在整个数据处理过程中,可以只占用几十兆的内存,而且运算量不会增加。
2、 循环调用RasterIo()读取图像时都执行一次打开文件和关闭文件释放RasterDataset指针的操作。这样做内存的开销极小,但频繁的打开关闭文件总是不太好。
希望各位大神能提出更好的解决方案!!!
作为菜鸟遇到的问题:对代码进行跟踪检查发现RasterIo()读取3.5G遥感影像的时候内存逐次增长,虽然每次循环都释放了当前块的内存,但是仍无法回落到处理这一块之前的值,直到最终释放GDALDataset指针,内存才会回落至打开文件前的值(内存占用最高2.4G)。内存的不断增长显然对处理大文件会产生致命问题!究其原因,每执行一次RasterIO内存都会(不太慢的)增长,以致于每一块处理完后内存不彻底回落。尝试每次处理完后删除当前的RasterBand指针也无法回落。
解决方法:
1、 使用RasterIO()对大图像进行分块操作。RasterIO()函数能够对图像任意指定区域任意波段的数据按指定数据类型,指定排列方式读入内存和写入文件中,因此可以实现对大影像的分块读,运算,写操作。对于大图像处理,按照传统方法,首先要将图像所有数据读入内存中,进行相应操作后,再一次性将处理好的数据写入文件中,这样需要耗费很大内存,容易内存溢出,而且存续可执行行差。采用分块处理技术,一幅1G的影像,在整个数据处理过程中,可以只占用几十兆的内存,而且运算量不会增加。
2、 循环调用RasterIo()读取图像时都执行一次打开文件和关闭文件释放RasterDataset指针的操作。这样做内存的开销极小,但频繁的打开关闭文件总是不太好。
希望各位大神能提出更好的解决方案!!!
相关文章推荐
- 利用JProfiler对应用服务器内存泄漏问题诊断一例(转)
- 利用JProfiler对应用服务器内存泄漏问题诊断一例(转)
- 利用JProfiler对应用服务器内存泄漏问题诊断一例
- 利用GDAL读取图片,将数据以BIP的方式存在内存中。
- 关于Poi读取Excel引发内存溢出问题的解决方法
- 利用Android中DDMS->Heap工具检测内存泄漏问题
- 关于利用opendatasource 读取excel文件中的数据问题以及更新数据库中对应数据的问题
- 关于c# 中读取系统内存大小的问题。
- 关于JAVA内存泄漏问题注意事项
- 利用JProfiler对应用服务器内存泄漏问题诊断一例(转)
- 利用WeakHashMap避免因缓存条目过期而造成的内存泄漏问题
- 利用WeakHashMap避免因缓存条目过期而造成的内存泄漏问题
- 利用JProfiler对应用服务器内存泄漏问题诊断一例(转)
- 关于android当中Service读取应用中的内存数据不更新问题
- 利用JProfiler对应用服务器内存泄漏问题诊断一例(转)
- 利用JProfiler对应用服务器内存泄漏问题诊断一例
- 关于如何利用DataSet来读取记录值的问题
- 利用JProfiler对应用服务器内存泄漏问题诊断一例(转)
- Silverlight读取文件加载到内存(StreamReader中文乱码问题)
- 内存泄漏问题研究