2

私は Mort Canty のhttp://mcanty.homepage.t-online.de/バイテンポラル RapidEye マルチスペクトル画像で Python iMAD 実装を実行しようとしています。これは基本的に、2 つの画像の正準相関を計算してから、それらを減算します。私が抱えている問題は、画像が 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

float の 10 x 25,000,000 numpy 配列を作成するだけでも、メモリ エラーがスローされます。これを回避する方法を知っている人はいますか?初めての投稿なので、投稿の仕方などアドバイスいただければ幸いです。

ご挨拶

4

1 に答える 1

1

numpyfloat64デフォルトで使用するため、 dm-array は 2GB のメモリ (8*10*25000000) を占有し、他の配列はおそらくそれぞれ約 200MB (~8*5000*5000) を使用します。

astype(float)は新しい配列を返すため、そのためのメモリも必要です。データを結果配列にコピーするときに型が暗黙的に変換されるため、おそらく必要ありません。

for ループで使用されたメモリがいつ解放されるかは、ガベージ コレクションによって異なります。GetRasterBandこれは、のメモリ オーバーヘッドを考慮していませんReadAsArray

入力データが 64 ビット浮動小数点数を使用していることは確かですか? dtype='f'32 ビット浮動小数点数を使用する場合は、配列を指定することでメモリ使用量を簡単に半分にすることができます。

于 2012-05-14T08:05:33.797 に答える