numpy.ndarray.nbytes
报告的内容让我很困惑。
我刚刚创建了一个大小为 100 万 (10^6) 的单位矩阵,因此它有 1 万亿行 (10^12)。 Numpy 报告该数组为 7.28TB,但根据 OSX 事件监视器的报告,python 进程仅使用 3.98GB 内存。
- 整个数组是否包含在内存中?
- Numpy 是否以某种方式压缩了它的表示,或者是由操作系统处理的?
- 如果我简单地计算
y = 2 * x
,它应该与x
大小相同,进程内存会增加到大约 30GB,直到它被操作系统。为什么,我可以在 x 上进行什么样的操作而不会使内存使用量扩展太多?
这是我使用的代码:
import numpy as np
x = np.identity(1e6)
x.size
# 1000000000000
x.nbytes / 1024 ** 4
# 7.275957614183426
y = 2 * x
# python console exits and terminal shows: Killed: 9
最佳答案
在 Linux 上(我假设同样的事情发生在 Mac 上),当程序分配内存时,操作系统在使用它之前不会实际分配它。
如果程序从不使用内存,那么操作系统就不必在上面浪费 RAM,但是当程序请求大量内存并且实际上需要使用它时,它确实会将操作系统置于一个位置,但是操作系统不够用。
发生这种情况时,操作系统可能会开始终止其他次要进程并将它们的 RAM 提供给请求进程,或者只是终止请求进程(现在正在发生这种情况)。
Python 使用的初始 4GB 内存可能是 numpy 在单位矩阵上设置 1
的页面;其余页面尚未使用。执行类似 2*x
的数学运算开始访问(并因此分配)所有页面,直到操作系统内存不足并终止您的进程。
关于python - 为什么这个巨大的(非稀疏的)numpy 矩阵适合 RAM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35382596/