ENVI/IDL混合编程批处理中内存的释放

原文链接: http://blog.sina.com.cn/s/blog_13691c3060102vhbi.html

以下内容为转载,原po请查阅xiegq的博客 ~~~
ENVI/IDL混合编程批处理中内存的释放
2015-04-30 17:46:17

对于大量的遥感数据而言,选择ENVI+IDL进行批处理,无疑是非常好的选择,无论是ENVI5.x之前版本的面向过程的处理,还是之后版本的面向对象的处理,基本上都能用IDL调用ENVI的函数,还是比较方便的。也就是说能用ENVI进行的处理,基本上都能用IDL进行批量处理。但是有个我觉得比较不好的地方就是处理完一个数据,ENVI都会把他读到内存中去,这样如果是处理成千上万的数据,就会造成一个问题,内存占用过大,导致程序,越来越慢,不仅如此还要担心程序会崩溃,所以,在这个过程中对内存的释放就显得尤为重要。

下面我就总结了对于ENVI/IDL来说,面向过程和面向对象编程中内存释放的方法

面向过程(适用于ENVI4.X以及ENVI5.X Classic):

;释放内存

            ;获取当前内存中的所有文件的fid

             fids = envi_get_file_ids()

             ;获取数组的大小

              size = size(fids)

              length = size[1]

            ;循环释放内存中的文件

            ;主要就是envi_file_mng这个函数,其中id是打开文件的id,另外还有两个关键字

            ;remove是只从内存中移除,​delete不仅从内存中移除也从硬盘上删除,大家要              ;慎用

            for i = 0L, length-1 do begin

                      envi_file_mng,id = fids[i],/remove

              endfor

​​面向对象(适用于ENVI5.X版本):

;释放内存

        ;获取当前内存中的所有文件的对象

        opendata = e.GetOpenData()

       ;获取数组的大小

        length= size(opendata,/DIMENSIONS)

        ​;循环释放内存中的文件

       ;之前得到的对象是ENVIRaster,所以可以调用其中的close方法,释放掉内存​

        for i = 0L,lengthl[0] -1 do begin

          opendata[i].close

        endfor

​前面两种释放文件的方法可以放在自己循环的最后面,当一个循环完成之后,就把内存释放掉,再进行下一次循环,这样就能快速的处理数据了。


envi_fiel_mng, id = ,/remove
本来最近在做批处理,每次运行程序一会儿就提示内存不足,我本来以为释放了,没想到认真查看了一下,才发现少打了/remove。希望大家切记!

猜你喜欢

转载自blog.csdn.net/qq_37970770/article/details/99195735