以下内容为转载,原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):
;释放内存;获取当前内存中的所有文件的fidfids = envi_get_file_ids();获取数组的大小size = size(fids)length = size[1];循环释放内存中的文件;主要就是envi_file_mng这个函数,其中id是打开文件的id,另外还有两个关键字;remove是只从内存中移除,?delete不仅从内存中移除也从硬盘上删除,大家要 ;慎用for i = 0L, length-1 do beginenvi_file_mng,id = fids[i],/removeendfor
??面向对象(适用于ENVI5.X版本):
;释放内存;获取当前内存中的所有文件的对象opendata = e.GetOpenData();获取数组的大小length= size(opendata,/DIMENSIONS)?;循环释放内存中的文件;之前得到的对象是ENVIRaster,所以可以调用其中的close方法,释放掉内存?for i = 0L,lengthl[0] -1 do beginopendata[i].closeendfor
?前面两种释放文件的方法可以放在自己循环的最后面,当一个循环完成之后,就把内存释放掉,再进行下一次循环,这样就能快速的处理数据了。
envi_fiel_mng, id = ,/remove
本来最近在做批处理,每次运行程序一会儿就提示内存不足,我本来以为释放了,没想到认真查看了一下,才发现少打了/remove。希望大家切记!