3

50,000x5,000 のマトリックス (フロート) ファイルがあります。を使用 x = np.genfromtxt(readFrom, dtype=float)してファイルをメモリにロードすると、次のエラー メッセージが表示されます。

ファイル "C:\Python27\lib\site-packages\numpy\lib\npyio.py"、1583 行目、genfromtxt for (i, converter) for enumerate(converters)])
MemoryError

Scipyを使用して各ベクトル間のユークリッド距離を計算しているため、ファイル全体をメモリにロードしたいと考えています。dis = scipy.spatial.distance.euclidean(x[row1], x[row2])

巨大な行列ファイルをメモリにロードする効率的な方法はありますか?

ありがとうございました。

Update:

私は問題を解決することができました。これが私の解決策です。それが効率的か論理的に正しいかはわかりませんが、私にとってはうまくいきます:

x = open(readFrom, 'r').readlines()
y = np.asarray([np.array(s.split()).astype('float32') for s in x], dtype=np.float32)
....
dis = scipy.spatial.distance.euclidean(y[row1], y[row2])

私のソリューションを改善するのを手伝ってください。

4

2 に答える 2

1

floatPythonはCに対応しているためdouble(少なくともほとんどのシステムでは)、実際には8バイトの浮動小数点数を使用しています。

a=np.arange(10,dtype=float)
print(a.dtype)  #np.float64

データ型を として指定する必要がありますnp.float32。OS、および 32 ビットか 64 ビットか (および 32 ビット python と 64 ビット python のどちらを使用しているか) によっては、numpy で使用できるアドレス空間が 4Gb よりも小さくなる可能性があり、ここでも問題になる可能性があります。 .

于 2012-07-14T16:26:05.933 に答える
1

OS と Python のバージョンによっては、1GB の配列を割り当てることができない可能性が非常に高くなります (mgilson の回答はここにあります)。問題は、メモリが不足していることではなく、連続したメモリが不足していることです。32 ビット マシンを使用している場合 (特に Windows を実行している場合)、メモリを追加しても効果はありません。64 ビット アーキテクチャに移行すると、おそらく役立つでしょう。

より小さなデータ型を使用すると、確かに役立ちます。使用する操作によっては、16 ビットの float または 8 ビットの int で十分な場合があります。

これがうまくいかない場合は、データがメモリに収まらないことを認めざるを得ません。ピースごとに処理する必要があります (この場合、データを HDF5 配列として保存すると非常に便利です)。

于 2012-07-14T16:34:06.427 に答える