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 位才能访问它。另一方面,对于如此大的数据集,您应该考虑使用核外计算的可能性。