2017-05-26 10 views
0

380Gbバイナリラスタからのデータの経験的累積分布関数(CDF)をプロットしようとしています。データの小さなマスクを使用すると、次のコードは完全に機能します。Python-非常に大きなラスタとプロットの経験累積分布関数、メモリエラーを読み取る

import numpy as np 
import matplotlib.pyplot as plt 
dem_name = open('./raster.dem','rb') 
vals = np.fromfile(dem_name,dtype='float32') 
vals = np.negative(vals[vals!=-9999]) 
vals = np.sort(vals) 
y = np.arange(1.,len(vals)+1.)/len(vals) 
plt.plot(vals,y) 

私はこのコードを使用してラスタ全体をロードしようとすると、しかし、それは明らかにメモリエラーが発生します。私のコンピュータは9Tbのディスク容量を持っていますが、16GbのRAMに制限されていますので、numpy.memmapを使って配列にラスタ値を取得しました。

dem_name = open('./raster.dem','rb') 
vals = np.memmap(dem_name,dtype='float32','r') 

これは動作しますが、私は、ラスタからNODATA値(-9999)のトリム値の符号を切り替える(負の値は正となる)と、最低から最高の値をソートする必要があります。

vals_real = np.memmap(np.sort(np.negative(vals[vals!=-9999]))) 

これは数時間のために実行され、その後、メモリエラーを与えます。

Yアレイ、

y = np.arange(1.,len(vals)+1.)/len(vals) 

は(メモリエラーを与える)もRAMに記憶されていることが大きすぎる、私はmemmapオブジェクトとして配列を格納する方法を見つけ出すことができません。

プロットするにもメモリが必要なので、ラスタファイル(2x 380Gb)の2倍のディスク容量が必要ですか?

要約すると、私は巨大なラスターを読み込んで、PythonとCDFをプロットする必要があります。小さなラスタでは非常に簡単ですが、私は完全なラスタでこのプロットを作成するのに失敗しました。

この質問が明確になることを願っています。前もって感謝します。

+0

なぜwho; eファイルをメモリに保存する必要がありますか?あなたはファイルを塊に分割しますか? – DrBwts

+0

ファイルの値の下限と上限を知っていますか? (たとえば、「-9999を除いて、すべての値は-1000〜1000です」など) –

答えて

0

380Gbの単精度浮動小数点では、約950億の値を持ちます。 95億のすべての値を使用してECDFをプロットしようとしないでください。ほとんどのプロットソフトウェアはその多くの点を扱うことができず、たとえ可能であっても、ほとんどのディスプレイは数千ピクセルの幅しかないので、それよりはるかに高い解像度でデータをプロットすることに意味はありません。

代わりに、ヒストグラムを計算し、バッチで作業してください。ファイル内の値の妥当な下限と上限をすでに知っている場合は、ヒストグラムのビンを事前に割り当てることができます。それ以外の場合は、各バッチに到着する新しいデータに適合するヒストグラムアルゴリズムが必要になることがあります。

関連する問題