Python Numpy.ndarray.shape limit
我想使用以下代码在Python中使用Numpy创建一个矩阵:Python Numpy.ndarray.shape limit,python,numpy,Python,Numpy,我想使用以下代码在Python中使用Numpy创建一个矩阵: import numpy result=numpy.zeros((20,20,20,30,30,30)) numpy.save('result',result) 我得到以下错误: Traceback (most recent call last): File "numpy_memoryerror.py", line 5, in <module> result=numpy.zeros((20,20,20,3
import numpy
result=numpy.zeros((20,20,20,30,30,30))
numpy.save('result',result)
我得到以下错误:
Traceback (most recent call last):
File "numpy_memoryerror.py",
line 5, in <module>
result=numpy.zeros((20,20,20,30,30,30))
MemoryError
然后代码就工作了
有人能告诉我形状元组的限制吗?它不是形状元组的一个基本限制,而是系统上没有足够的内存(RAM),因此出现了
内存错误
同样,20*20*20*30*30*30是2.16亿个64位(8字节)浮点或略大于1.6GB的RAM。那么,在运行脚本时,您是否有1.6GB的可用RAM?(不要忘记使用python、操作系统、其他运行程序等使用的所有RAM)。如果您使用的是linux/unix,您可以通过在命令提示符下键入free-m
来查看空闲内存的大小。在windows中,您可以通过转到任务管理器查看可用内存。此外,一些操作系统限制单个进程(如python)可以分配的内存量;e、 例如,32位windows每个进程只提供2 GB的地址空间)
与20*20*20*10*10*10相比,20*20*10*10仅为~0.06GB(或仅为内存的27倍)
如果不需要8字节浮点,可以这样做
numpy.zeros(20,20,20,30,30,30, dtype='float32')
这将通过使用单精度(32位)浮点将内存占用减半。默认情况下,numpy使用dtype='float64'
粗略地说,32位浮点有8位精度,64位浮点有16位精度。这意味着1+1e-8对于32位浮点显示为1,1+1e-16对于64位浮点显示为1,但是1+1e-15对于64位浮点显示为1.000000000000001,而不是32位浮点。我使用dtype='float32'尝试了它,它工作正常,创建了一个大约860mb的文件。但是,我运行Win7 64位,我有4GB的ram,其中大约有2.2GB可用。顺便说一句,有一种ram交换(分页)机制,用于处理需要更多ram的进程。在这种情况下,它不起作用。@makmiler:请注意,对于numpy
数组,您需要有连续内存。即使您有足够的内存可以使用,它也不一定是连续的,因为它需要如此大的内存块。Thanks@eat:Windows报告为“可用”的内存是可分页的,因此可以将其分页到单个连续块。@Sven:确定吗?例如,matlab的文档(也要求阵列使用连续的RAM块)报告内存碎片导致内存不足错误。请看:@Sven:这一点很好,但在做出任何最终判断之前,我希望OP能更详细地描述他的环境。AFAIU,即使是64位Windows,但32位进程的用户模式虚拟地址空间(仅限于2GB)也可能出现这种碎片。谢谢我在我的电脑上试用,它会生成一个大小为1.60GB(1728000096字节)的.npy文件。
numpy.zeros(20,20,20,30,30,30, dtype='float32')