Python 无法分配形状和数据类型为的数组
在Ubuntu18上,我面临着在numpy中分配巨大数组的问题,而在MacOS上却没有同样的问题 我正在尝试为具有形状Python 无法分配形状和数据类型为的数组,python,numpy,data-science,Python,Numpy,Data Science,在Ubuntu18上,我面临着在numpy中分配巨大数组的问题,而在MacOS上却没有同样的问题 我正在尝试为具有形状(156816,3653806) 与 当我在Ubuntu操作系统上出错时 >>> import numpy as np >>> np.zeros((156816, 36, 53806), dtype='uint8') Traceback (most recent call last): File "<stdin>", line
(156816,3653806)
与
当我在Ubuntu操作系统上出错时
>>> import numpy as np
>>> np.zeros((156816, 36, 53806), dtype='uint8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
numpy.core._exceptions.MemoryError: Unable to allocate array with shape (156816, 36, 53806) and data type uint8
我在某个地方读到,np.zeros
不应该真正分配数组所需的全部内存,而应该只分配非零元素。尽管Ubuntu机器有64gb内存,而我的MacBookPro只有16gb
版本:
Ubuntu
os -> ubuntu mate 18
python -> 3.6.8
numpy -> 1.17.0
mac
os -> 10.14.6
python -> 3.6.4
numpy -> 1.17.0
PS:在Google Colab上也失败了这可能是由于您的系统模式 在默认模式下,
0
启发式超限制处理。地址空间的明显超限被拒绝。用于典型系统。它确保了严重的野生分配失败,同时允许过度分配以减少交换使用。在此模式下,允许根用户分配稍多的内存。这是默认设置
这里没有很好地解释所使用的确切启发式,但这将在和中进行更多讨论
您可以通过运行
$ cat /proc/sys/vm/overcommit_memory
0
在这种情况下,您正在分配
>>> 156816 * 36 * 53806 / 1024.0**3
282.8939827680588
~282 GB,内核说得很好,显然我不可能将这么多物理页面提交给它,它拒绝分配
如果(以root用户身份)运行:
这将启用“always Overmit”模式,并且您将发现,实际上,系统将允许您进行分配,无论它有多大(至少在64位内存寻址范围内)
我自己在一台有32GB内存的机器上进行了测试。使用Overmit模式0
我还得到了一个MemoryError
,但在将其更改回1
后,它可以工作:
>>> import numpy as np
>>> a = np.zeros((156816, 36, 53806), dtype='uint8')
>>> a.nbytes
303755101056
然后,您可以继续向数组中的任何位置写入数据,并且当您显式地向该页面写入数据时,系统将只分配物理页面。因此,您可以小心地将其用于稀疏阵列。我在Window上遇到了同样的问题,并找到了此解决方案。因此,如果有人在Windows中遇到这个问题,我的解决方案是增加大小,因为这对我来说也是一个内存过度使用的问题 视窗8
我在Windows上也遇到了这个问题。我的解决方案是将Python从32位版本切换到64位版本。事实上,一个32位软件,就像一个32位CPU,可以寻址一个RAM(2^32)。因此,如果您的RAM超过4GB,32位版本就无法利用它 使用64位版本的Python(在下载页面中标记为x86-64),问题就消失了 您可以通过输入解释器来检查您的版本。一、 对于64位版本,现在有:
Python 3.7.5rc1(tags/v3.7.5rc1:4082f600a5,2019年10月1日,20:28:14)[MSC v.1916 64位(AMD64)]
,其中[MSC v.1916 64位(AMD64)]表示“64位Python”
资料来源:
有时,由于内核已达到极限,会弹出此错误。尝试重新启动内核,重新执行必要的操作
>>> 156816 * 36 * 53806 / 1024.0**3
282.8939827680588
$ echo 1 > /proc/sys/vm/overcommit_memory
>>> import numpy as np
>>> a = np.zeros((156816, 36, 53806), dtype='uint8')
>>> a.nbytes
303755101056
mask = np.zeros(edges.shape)
mask = np.zeros(edges.shape,dtype='uint8')
data['label'] = data['label'].astype(np.uint8)