以下內容爲轉載,原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。希望大家切記!