bra*_*n85 29 arrays size numpy max python-2.7
我正在尝试创建一个包含2 708 000 000个元素的矩阵.当我尝试创建这个大小的numpy数组时,它给了我一个值错误.有什么办法可以增加最大阵列大小吗?
ValueError Traceback(最近一次调用最后一次)
ValueError:超出允许的最大大小
sho*_*yer 19
您正在尝试创建一个包含27亿条目的数组.如果您运行的是64位numpy,每个条目8个字节,则总共为20 GB.
所以几乎可以肯定你的机器内存不足.numpy中没有通用的最大数组大小.
Dav*_*dmh 11
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
Run Code Online (Sandbox Code Playgroud)
在你的情况下,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)
Run Code Online (Sandbox Code Playgroud)
请注意,如果我尝试创建一个荒谬的大数组,我可以复制你的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
Run Code Online (Sandbox Code Playgroud)
如果你的机器有很多内存,正如你所说,它将是64位,所以你应该安装Python 64位才能访问它.另一方面,对于这样的大数据集,您应该考虑使用核心计算的可能性.
我能够创建一个大小为60亿的数组,占用了45GB的内存。默认情况下,numpy创建了一个类型为float64的数组。通过降低精度,我可以节省很多内存。
np.arange(6000000000,dtype=np.dtype('f8'))
np.arange(6000000000,dtype=np.dtype('f4'))
#etc...
Run Code Online (Sandbox Code Playgroud)
默认== float64
np.float64-45.7GB
np.float32-22.9GB
np.int8-5.7GB
显然,一个8位整数不能存储6B的值。 我确定某个时候会存在最大大小,但是我怀疑它在2016年可能会超过FAR。有趣的是,“ Python Blaze”允许您在磁盘上创建numpy数组。我记得前一段时间玩过它,并创建了一个占用1TB磁盘的超大型阵列。
归档时间: |
|
查看次数: |
48011 次 |
最近记录: |