我试图创建一个包含2个708 000 000元素的矩阵。 当我尝试建立这种规模的numpy的阵列它给了我一个值误差。 有没有什么办法可以增加最大数组的大小?
一个= np.arange(27.08亿)
ValueError异常回溯(最近通话最后一个)
ValueError异常:允许的最大尺寸超过
我试图创建一个包含2个708 000 000元素的矩阵。 当我尝试建立这种规模的numpy的阵列它给了我一个值误差。 有没有什么办法可以增加最大数组的大小?
ValueError异常回溯(最近通话最后一个)
ValueError异常:允许的最大尺寸超过
你想创建2.7十亿项的数组。 如果你正在运行64位numpy的,在每个条目8个字节,这将是20 GB在所有。
因此,几乎可以肯定你刚才跑出来的内存你的机器上。 存在numpy的没有一般最大数组大小。
一个ValueError指大小太大,无法分配,不就是有没有足够的内存。 在我的笔记本电脑,采用64位蟒蛇,我可以分配它,如果我减少的位数:
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
在你的情况,人气指数使用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位能够访问它。 在另一方面,对于这样大的数据集,你应该考虑使用核的计算出的可能性。
我能够创建一个大小为60亿是吃了45GB的存储阵列。 默认情况下,numpy的创建与float64的D型数组。 通过降低精度,我能节省大量的内存。
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的价值。 我敢肯定,一个最大尺寸存在在某些时候,但我怀疑这是FAR过去的2016年中任何可能的有趣的是,“Python的火焰”让你在磁盘上创建numpy的阵列。 我记得前一段时间摆弄它,创造一个非常大的数组,拿起盘1TB。
它确实与系统相关的最大地址的长度,就是说它简单地说,32位的系统或64位系统。 下面是这些问题的解释,最初是从马克·迪金森
简短的回答:Python的对象开销杀了你。 在64位机器上的Python 2.x中,字符串列表,甚至占字符串的内容之前,每消耗列表条目48个字节。 这是在间接的8.7 GB的数组的你描述的大小。 在32位机这将是一个好一点:每个列表条目只有28个字节。
更详细的解释:你应该知道的Python对象本身可能是相当大的:即使是简单的对象,如整数,浮点数和字符串。 在你的代码要结束了对字符串列表清单。 在我的(64位)的机器,甚至是空字符串对象占用40个字节,并且你需要添加8个字节为记录指向这个字符串对象在内存中的列表指针。 所以,这已经每个条目48个字节,或周围8.7 GB。 虽然Python在时间分配中的8个字节的倍数的内存,并且您的字符串几乎肯定非空,实际上是在寻找每个条目56或64个字节(我不知道你的字符串有多长)。
可能的解决方案:
(1)你可能会做(略)从字符串转换您的输入整数或漂浮在适当更好。
(2)你会做的或者更好的使用Python的数组类型(不一样的名单!)或使用numpy的:那么你的整数或浮点数将只需要每4首或8个字节。
因为Python 2.6,你可以得到有关物体的大小与sys.getsizeof功能的基本信息。 请注意,如果你把它应用到一个列表(或其他容器),那么返回的大小不包括包含列表对象的大小; 唯一的用于保存这些对象的结构。 这里是我的机器上的一些价值观。