2 708 000 000の要素を含むマトリックスを作成しようとしています。このサイズのnumpy配列を作成しようとすると、値エラーが発生します。最大配列サイズを増やす方法はありますか?
ValueErrorトレースバック(最後の最後の呼び出し)
ValueError:最大許容サイズを超えました
27億エントリの配列を作成しようとしています。エントリごとに8バイトで64ビットのnumpyを実行している場合、合計で20 GBになります。
そのため、ほぼ確実にマシンのメモリが不足しました。 numpyには一般的な最大配列サイズはありません。
ValueErrorは、サイズが割り当てに対して大きすぎることを示しており、メモリが十分ではないことを示しています。私のラップトップでは、64ビットのPythonを使用して、ビット数を減らすとそれを割り当てることができます。
In [16]: a=np.arange(2708000000)
---------------------------------------------------------------------------
MemoryError Traceback (most recent call last)
<ipython-input-16-aaa1699e97c5> in <module>()
----> 1 a=np.arange(2708000000)
MemoryError:
# Note I don't get a ValueError
In [17]: a = np.arange(2708000000, dtype=np.int8)
In [18]: a.nbytes
Out[18]: 2708000000
In [19]: a.nbytes * 1e-6
Out[19]: 2708.0
あなたの場合、arangeはint64
ビットを使用します。これは、16倍、つまり約43 GBであることを意味します。 32ビットプロセスは、約4 GBのメモリにしかアクセスできません。
根本的な理由は、データにアクセスするために使用されるポインターのサイズと、それらのビットで表現できる数です。
In [26]: np.iinfo(np.int32)
Out[26]: iinfo(min=-2147483648, max=2147483647, dtype=int32)
In [27]: np.iinfo(np.int64)
Out[27]: iinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)
途方もなく大きな配列を作成しようとすると、ValueErrorを複製できることに注意してください。
In [29]: a = np.arange(1e350)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-29-230a6916f777> in <module>()
----> 1 a = np.arange(1e350)
ValueError: Maximum allowed size exceeded
あなたのマシンが多くのメモリを持っている場合、あなたが言ったように、それは64ビットになるので、あなたはそれにアクセスできるようにPython 64ビットをインストールする必要があります。データセットを使用する場合、コア外の計算を使用する可能性を考慮する必要があります。
45GBのメモリを消費する60億のサイズのアレイを作成できました。デフォルトでは、numpyはfloat64のdtypeで配列を作成しました。精度を落とすことで、多くのメモリを節約できました。
np.arange(6000000000,dtype=np.dtype('f8'))
np.arange(6000000000,dtype=np.dtype('f4'))
#etc...
デフォルト== float64
np.float64-45.7GB
np.float32-22.9GB
np.int8-5.7GB
明らかに、8ビット整数は6Bの値を格納できません。 ある時点で最大サイズが存在することは確かですが、2016年には可能な限り過去のものと思われます。興味深いことに、 "Python Blaze"を使用すると、numpy配列をディスク上に作成できます。少し前にそれで遊んで、1TBのディスクを占有する非常に大きなアレイを作成したことを思い出します。