您的阵列太大,无法容纳两个系统上的物理 RAM:
110000 * 80000 * 3 * 8 / 1024 / 1024 / 1024 = 196.[69] GB
然而,这取决于您的系统如何处理内存请求以及如何“存储”内存。例如,系统可以简单地为您的进程“保留”内存,但推迟实际分配,直到读取/修改内存为止。即使分配了内存,内存也可以被压缩(如评论中所述,感谢@Martijn Pieters),并且有很多零可以很好地压缩 - 但是,一旦修改内存,压缩效率就会降低,并且使用更多的“真实内存”。
这意味着失败时由系统决定(如果您实际对数组执行某些操作,两者最终都会失败)。在您的情况下,当您请求的物理内存多于实际内存时,Windows 选择立即失败。在 Mac 上,似乎您必须修改“足够”的值(另请参阅这个答案关于“为什么 352GB NumPy ndarray 可以在 8GB 内存 macOS 计算机上使用?” https://stackoverflow.com/q/54961554/5393381)直到失败。
import numpy as np
arr = np.zeros((110000,80000,3)) # MemoryError on Windows
arr += 10 # MemoryError on Mac
你可以使用例如psutil
检查使用的内存量(物理和虚拟):
import psutil
print(psutil.virtual_memory())
# svmem(total=4170924032, available=1666629632, percent=60.0, used=2504294400, free=1666629632)
arr = np.zeros((10000, 10000))
print(psutil.virtual_memory())
# svmem(total=4170924032, available=1664675840, percent=60.1, used=2506248192, free=1664675840)
arr += 10
print(psutil.virtual_memory())
# svmem(total=4170924032, available=864059392, percent=79.3, used=3306864640, free=864059392)
所以即使在 Windows 上np.zeros
直到需要时才立即“使用”物理内存。
我该如何处理这个问题?
最简单(但可能最昂贵)的选择是购买(大量)更多内存。但您也可以尝试使用适合您的物理内存的块大小来“分块”处理。最终,最好的解决方案是重新考虑您的方法/算法,这样您就不需要那么多内存。