4

numpy.loadtxtを介してcsvファイルをnumpy配列にロードしています。私のデータには約100万のレコードと87の列があります。object.nbytesはわずか177159666バイトですが、scikit-learnを使用してディシジョンツリーをトレーニングしているときに「MemoryError」が発生するため、実際にははるかに多くの記憶が必要になります。また、データを読み取った後、私のシステムで使用可能なメモリは1.8ギガ減少しました。私は3ギガのメモリを搭載したLinuxマシンで作業しています。では、object.nbytesはnumpy配列の実際のメモリ使用量を返しますか?

train = np.loadtxt('~/Py_train.csv', delimiter=',', skiprows=1, dtype='float16')
4

3 に答える 3

5

大きな400,000x100,000のマトリックスを作成しようとしたときに、同様の問題が発生しました。そのすべてのデータをndarrayに適合させることは不可能です。

しかし、私が思いついた大きな洞察は、行列のほとんどの値が空であるため、これはスパース行列として表すことができるということでした。スパース行列は、より少ないメモリを使用してデータを表すことができるため、便利です。Scipy.sparseのスパース行列の実装を使用しましたが、この大きな行列をメモリ内に収めることができます。

これが私の実装です:

https://github.com/paolodm/Kaggle/blob/master/mdschallenge/buildmatrix.py

于 2012-08-02T15:15:57.270 に答える
3

おそらく、以下を使用することでパフォーマンスが向上しますnumpy.fromiter

In [30]: numpy.fromiter((tuple(row) for row in csv.reader(open('/tmp/data.csv'))), dtype='i4,i4,i4')
Out[30]: 
array([(1, 2, 3), (4, 5, 6)], dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4')])

どこ

$ cat /tmp/data.csv 
1,2,3
4,5,6

または、使用することを強くお勧めします。これは、統計分析を行うための多くの効用関数にpandas基づいており、それらを備えています。numpy

于 2012-08-02T15:18:37.513 に答える
0

私はちょうど同じ問題を抱えていました:

保存した.npyファイルは752M(ディスク上)で、arr.nbytes = 701289568(〜669M)です。ただし、np.loadは2.7gのメモリを消費します。つまり、実際に必要なメモリの4倍の時間です。

https://github.com/numpy/numpy/issues/17461

そしてそれは判明します:

データ配列には、混合された(少量の)文字列と(大量の)数値が含まれています。

ただし、これらの8バイトの場所はそれぞれPythonオブジェクトを指しており、そのオブジェクトには少なくとも24バイトに加えて、数値または文字列用のスペースが必要です。

したがって、メモリ内(8バイトポインタ+ 24バイト)〜=ファイル内のほとんどの8バイト(2倍の数)の4倍。

注:np.save()とnp.load()は対称ではありません:

--np.save()は数値型をスカラーデータとして保存するため、ディスクファイルサイズはユーザーが念頭に置いているデータサイズと一致し、小さいです

--np.load()は、数値型をPyObjectとしてロードし、ユーザーが予想したよりも4倍メモリ使用量を増やします。

これは、csvファイルなどの他のファイル形式でも同じです。

結論:np配列で混合型(np.objectとしての文字列とnp.numbers)を使用しないでください。np.doubleなどの同種の数値タイプを使用します。その場合、メモリはダンプディスクファイルとほぼ同じスペースを使用します。

于 2020-10-05T21:42:56.010 に答える