提问人:Paul Jurczak 提问时间:10/9/2023 最后编辑:Paul Jurczak 更新时间:10/9/2023 访问量:57
NumPy 内存分配结果不一致
Inconsistent results of NumPy memory allocation
问:
Ubuntu 22.04 上的这个 Python 3.11 脚本,大约有 16.4GB 内存可用(没有交换文件):
import numpy as np, psutil
print(f'{psutil.virtual_memory().available:,}')
try:
a = np.empty((100_000_000_000), dtype='u1') # variant A
# a = np.empty((30_000_000_000), dtype='u1') # variant B
# a = np.ones((30_000_000_000), dtype='u1') # variant C
print(f'{a.size:,}')
except RuntimeError as e:
print(e)
print('Done')
产生意想不到的不一致结果。
变体 A 按预期生成异常:
16,436,457,472
...
numpy.core._exceptions._ArrayMemoryError: Unable to allocate 93.1 GiB for an array with shape (100000000000,) and data type uint8
变体 B 意外分配的数组大于可用内存:
16,335,642,624
30,000,000,000
Done
变体 C 以静默方式失败:
16,337,346,560
有人可以解释变体 B 和 C 的行为吗?
答: 暂无答案
评论
30_000_000_000
psutil.virtual_memory().available
似乎返回了我机器上的可用 RAM 量,但程序可以使用更多。首先,内存可以在主流系统上压缩(实际上在 Windows 上是默认的),然后交换文件/存储可用于存储部分 RAM,因此您通常可以分配和填充更多。更不用说可用的 RAM 量会动态变化,并且由于任何正在运行的(后台)进程,在分配后可能会更低。基于可用RAM的策略注定要失败。np.full