Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用np.Zero时Windows上的MemoryError,而不是MacOS上的MemoryError_Python_Windows_Macos_Python 2.7_Numpy - Fatal编程技术网

Python 使用np.Zero时Windows上的MemoryError,而不是MacOS上的MemoryError

Python 使用np.Zero时Windows上的MemoryError,而不是MacOS上的MemoryError,python,windows,macos,python-2.7,numpy,Python,Windows,Macos,Python 2.7,Numpy,我想构建一个numpy阵列,但我在有16 GB RAM的windows中得到MemoryError。详情如下: Python 2.7.13 |Anaconda custom (64-bit)| (default, May 11 2017, 13:17:26) [MSCv.1500 64 bit (AMD64)] on win32 xx = np.zeros((110000,80000,3)) Traceback (most recent call last): File "<stdin

我想构建一个numpy阵列,但我在有16 GB RAM的windows中得到MemoryError。详情如下:

Python 2.7.13 |Anaconda custom (64-bit)| (default, May 11 2017, 13:17:26) [MSCv.1500 64 bit (AMD64)] on win32

xx = np.zeros((110000,80000,3))

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
xx = np.zeros((1100000,80000000,3))
python(713,0x7fffa76b33c0) malloc: *** mach_vm_map(size=211200000000000) 
failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
当我最后增加大小时,我在Mac上得到错误,但是错误不同,如下所示:

Python 2.7.13 |Anaconda custom (64-bit)| (default, May 11 2017, 13:17:26) [MSCv.1500 64 bit (AMD64)] on win32

xx = np.zeros((110000,80000,3))

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
xx = np.zeros((1100000,80000000,3))
python(713,0x7fffa76b33c0) malloc: *** mach_vm_map(size=211200000000000) 
failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
xx=np.零((110000080000000,3))
python(713,0x7fffa76b33c0)malloc:**mach_vm_映射(大小=211200000000)
失败(错误代码=3)
***错误:无法分配区域
***在malloc\u error\u break中设置断点以进行调试
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
记忆者
我该如何处理这个问题


您的阵列太大,无法装入两个系统上的物理RAM:

110000 * 80000 * 3 * 8 / 1024 / 1024 / 1024 = 196.[69] GB
但是,这取决于您的系统如何处理内存请求以及如何“存储”内存。例如,系统可以简单地为您的进程“保留”内存,但推迟实际分配,直到内存被读取/修改。即使分配了内存,也可以对内存进行压缩(如注释中所述,谢谢@Martijn Pieters),并且可以很好地压缩大量的零-但是一旦修改内存,压缩效率就会降低,使用的是更多的“真实内存”

这意味着当它失败时,它取决于系统(如果您实际对阵列执行某些操作,两者最终都会失败)。在您的情况下,Windows选择在您请求的物理内存超过您所拥有的时立即失败。在Mac上,似乎必须修改“足够”的值(另请参见),直到失败

import numpy as np
arr = np.zeros((110000,80000,3))  # MemoryError on Windows
arr += 10                         # MemoryError on Mac
例如,您可以使用
psutil
检查使用的内存量(物理和虚拟):

因此,即使在Windows上,
np.zeros
也不会立即“使用”物理内存,直到需要它

我该如何处理这个问题


最简单(但可能最昂贵)的选择是购买(更多)RAM。但是您也可以尝试使用适合您的物理内存的块大小来“块”处理。最终,最好的解决方案是重新考虑您的方法/算法,这样您就不需要那么多内存。

如前所述,您的阵列太大,无法容纳两台机器上的物理内存。 但关键是,物理内存只是moder系统上通常可用的内存的一部分,另一部分是虚拟内存

我不确定Windows版本的NumPy是否真的编译为只使用物理内存,这可能是,但我发现不太可能。 因此,您的Mac可以处理该阵列的原因可能是,它被配置为具有比Windows计算机上可用的虚拟内存(读取页面文件)大得多的虚拟内存(读取交换)。 因此,在Windows计算机上增加页面文件大小可能会解决您的问题。 然而,这远远不够理想,因为虚拟内存通常比物理内存慢几个数量级


最好的选择是使用能够处理块的算法,或者,如果不可能的话,应该使用阵列,这样至少可以在磁盘上就地工作,从而避免来回复制大量数据。

您计算过阵列需要多少内存吗?我知道,但为什么在mac中,即使是100倍大的阵列大小,我也不会遇到这个问题。我从命令行运行了这两行,我不明白为什么在这些情况下会有这样的差异;我看到了相同的错误:
MemoryError
,这是您可以预料到的。如果您需要解决一个需要比您的系统多得多内存的问题,那么最好以适合内存的块来解决它。需要明确的是:您尝试创建的阵列需要~200GB内存!我的问题是,为什么在Mac中,当我定义一个大小为110000*80000*3的数组时,我没有得到这个错误,因为我在配置更高的Windows中得到了一个错误。我在Mac上没有得到任何错误。@salarrazavi即使使用
arr[0,0,0]=10
行也没有?那会很奇怪,那
arr[-1,-1,-1]=100
arr+1
呢?我在第一篇文章中上传了截图。另外,数组的最后一个元素也可以通过这种方式定义。@salarrazavi我更新了答案:)不幸的是,我自己没有访问Mac的权限,并且认为它会像我的linux虚拟机一样…在我的Mac上(使用Python3),
x=np.zeros((11000080000,3))
也会直接使用
内存错误失败。但我仍然不明白为什么会有人想使用大约10倍于可用内存大小的阵列。。。。。。。。。正如许多人现在提到的:“重新思考你的方法/算法”,我可以通过增加虚拟内存大小来解决这个问题。Thanks@salarrazavi,这不是一个切实可行的解决办法。程序假设随机访问内存,并且依赖一个比物理RAM大12倍的分页文件可能会使您的系统慢到爬行。也许我说得不够清楚,但这个答案的目的是阐明这两种不同行为的起源,不建议增加虚拟内存来解决潜在问题。我非常同意关于重新考虑你的方法的建议。