web-dev-qa-db-ja.com

numpy配列の最大サイズは何ですか?

2 708 000 000の要素を含むマトリックスを作成しようとしています。このサイズのnumpy配列を作成しようとすると、値エラーが発生します。最大配列サイズを増やす方法はありますか?

a = np.arange(2708000000)

ValueErrorトレースバック(最後の最後の呼び出し)

ValueError:最大許容サイズを超えました

26
branwen85

27億エントリの配列を作成しようとしています。エントリごとに8バイトで64ビットのnumpyを実行している場合、合計で20 GBになります。

そのため、ほぼ確実にマシンのメモリが不足しました。 numpyには一般的な最大配列サイズはありません。

16
shoyer

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ビットをインストールする必要があります。データセットを使用する場合、コア外の計算を使用する可能性を考慮する必要があります。

10
Davidmh

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のディスクを占有する非常に大きなアレイを作成したことを思い出します。

6
J'e