1)主pro中可以用delvar直接删除变量,释放内存;
2)数组运算后如原数组无其他用处,可用temporary()函数;
IDL>
help,data
DATA
INT = Array[400, 400]
IDL>
data1 = Temporary(data)*2
IDL>
help,data
DATA
UNDEFINED =
IDL>
help,data1
DATA1
INT = Array[400, 400]
3)IDL8.0下的新招
(1)修改IDL启动配置文件内容
C:\Program
Files\ITT\IDL\IDL80\bin\bin.x86\idlde.ini
-vm
C:\Program
Files\ITT\IDL\IDL80\bin\bin.x86\jre\bin
-vmargs
-Xms128m
-Xmx128m
删除后面三行,即
-vm
C:\Program
Files\ITT\IDL\IDL80\bin\bin.x86\jre\bin
(2)使用系统变量!Null
IDL>
help,data1
DATA1
INT = Array[400, 400]
IDL>
data1 = !null
IDL>
help,data1
DATA1
UNDEFINED = !NULL
对于大量的遥感数据而言,选择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
前面两种释放文件的方法可以放在自己循环的最后面,当一个循环完成之后,就把内存释放掉,再进行下一次循环,这样就能快速的处理数据了。作者:xiegq
加载中,请稍候......