2012-05-14 98 views
2

我試圖運行Mort Canty的http://mcanty.homepage.t-online.de/在雙時相RapidEye多光譜圖像上實現Python iMAD。它基本上計算兩幅圖像的典型相關性,然後將它們相減。我遇到的問題是 圖像是5000 x 5000 x 5(帶)像素。如果我嘗試在 上運行此圖像,則會出現內存錯誤。大衛星圖像處理

會使用像pyTables這樣的東西幫助我嗎?

Mort Canty的代碼試圖做的是使用gdal加載圖像,然後將它們存儲在10 x 25,000,000的數組中。

# initial weights 
    wt = ones(cols*rows)  
    # data array (transposed so observations are columns) 
    dm = zeros((2*bands,cols*rows)) 
    k = 0 
    for b in pos: 
    band1 = inDataset1.GetRasterBand(b+1) 
    band1 = band1.ReadAsArray(x0,y0,cols,rows).astype(float) 
    dm[k,:] = ravel(band1) 
    band2 = inDataset2.GetRasterBand(b+1) 
    band2 = band2.ReadAsArray(x0,y0,cols,rows).astype(float)   
    dm[bands+k,:] = ravel(band2) 
    k += 1 

即使只是創建一個10 x 25,000,000 numpy浮點陣列拋出一個內存錯誤。任何人都有如何解決這個問題的好主意?這是我的第一篇文章,因此任何有關如何發佈的建議都會受到歡迎。

問候

回答

0

numpy使用float64每默認的,所以你dm -array佔用了2GB的內存(8 * 10 * 25000000),其他陣列大概有200MB(〜8 * 5000 * 5000)的每個。

astype(float)返回一個新的數組,因此您也需要內存 - 並且可能甚至不需要,因爲在將數據複製到結果數組時,該類型被隱式轉換。

當for循環中使用的內存被釋放取決於垃圾回收。並且這不考慮GetRasterBand,ReadAsArray的內存開銷。

是否確定您的輸入數據使用64位浮點數?如果它使用32位浮點數,那麼通過在您的陣列上指定dtype='f',可以簡化一半的內存使用情況。

+0

我仍然得到內存不足的錯誤,如果我指定的D型到 'F':回溯(最近通話最後一個): 文件 「C:\ pythonxy \ iMad.py」,線路172,在 的main() 文件「C:\ pythonxy \ iMad.py」,第79行,主 dm =零((2 *條帶,列*行),dtype ='f') MemoryError順便提一句,我有8克的內存。是否有任何簡單的方法,例如使用pytables將這些大數組寫入hdf5文件,並像通常的numpy數組一樣操作它們? – JEquihua