2017-06-04 9 views
0

私はpythonの初心者でnumpyを使い始めました。私は紙からアルゴリズムを守っており、データセットでは1million * 1millionの配列が必要です。Python:numpy配列を使用するとmemoryerrorを回避する別の方法はありますか?

正確なコードは、私が16ギガバイトのRAMを持っていますが、numpyのは、それ故に作成としながら、メモリに配列をロードしようと、私はmemoryerrorを取得していますlarray(np.random.normal(0, sigma**2, size=(794832, 794832))

です。私はlazyarrayで遅延初期化を使用しようとしてもまだ動作しませんでした。

ramではなくファイルシステムを使用する配列を作成する方法はありますか?

ありがとうございます。

+1

4 TB以上のRAMが必要です。スワップスペースが十分ではないと思います。 – Daniel

+0

https://stackoverflow.com/questions/1053928/very-large-matrices-using-python-and-numpy – clockwatcher

+0

消費者クラスのPCに1兆個の要素を含む配列を格納する方法はありません。二次メモリを使用したとしても、テラバイト級のハードディスクが必要です。実際に10^6 x 10^6配列で何をしようとしていますか?これはXYの問題かもしれません – JacaByte

答えて

1

作成するデータのサイズは、データの行列サイズと精度の種類によって異なります。

np.random.normalを使用して、float64精度の型の値を持つ行列を作成しようとしています。 64番号は、各番号に64ビットを使用していることを意味します。したがって、各番号には8バイト(バイトあたり8ビット)のメモリが必要です。マトリックスの形状/寸法が4000x794832の場合は、〜23.7GB [4000 * 794832 * 8]のメモリ割り当てが必要です。

16GBのRAMを使用している場合は十分ではないため、十分に定義されている場合はSWAPを使用するため、作成に時間がかかり、メモリが不足することがあります。

質問は、浮動小数点数の精度が必要ですか?なぜなら、通常の科学者の発展のためにはそうだと思われるからです。したがって、次の数学演算を高速化するには、行列の精度タイプをfloat16([4000 * 794832 * 2]など)に変更することを検討してください。

import numpy as np 
a = np.random.normal(0, 0.7**2, size=(4000,794832)) 
a.nbytes # will give a size of 25434624000 [~23.7GB] (huge number) 
b = np.random.normal(0, 0.7**2, size=(4000,794832)).astype(np.float16) 
b.nbytes # will give a size of 6358656000 [~5.9GB](big but at least you can do everything on RAM) 

この場合の問題は、非常に効率的なオプションではありませんこれは、のfloat64マトリックスを作成し、それを変換しますのでnp.random.normalは、dtype直接numpyのを定義するオプションを持っていないことです。しかし、他の選択肢がない場合...