ENVI/IDL混合編程批處理中內存的釋放

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章