为什么这个巨大的(非稀疏的)numpy矩阵适合RAM

时间:2016-02-13 16:53:46

标签: python numpy matrix

我对numpy.ndarray.nbytes报道的内容感到非常困惑。

我刚创建了一个大小为100万(10 ^ 6)的单位矩阵,因此有1万亿行(10 ^ 12)。 Numpy报告说这个数组是7.28TB,但是python进程只使用了3.98GB的内存,正如OSX活动监视器所报告的那样。

  • 整个数组是否包含在内存中?
  • 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

2 个答案:

答案 0 :(得分:5)

在Linux上(我假设在Mac下发生同样的事情),当程序分配内存时,操作系统在使用它之前并没有实际分配它。

如果程序从不使用内存,那么操作系统不必浪费RAM,但是当程序请求大量内存并且实际需要使用它时,它确实将操作系统置于某个位置,但操作系统还不够。

当发生这种情况时,操作系统可能会开始杀死次要的其他进程并将其RAM提供给请求进程,或者只是终止请求进程(这就是现在发生的情况)。

Python使用的最初4GB内存可能是numpy在单位矩阵上设置1的页面;剩下的页面还没有被使用过。像2*x这样的数学运算开始访问(从而取消)所有页面,直到操作系统内存不足并终止你的进程。

答案 1 :(得分:1)

系统只分配内存虚拟,只有你第一次写入这个内存,它实际上是实际使用的。对于您的示例,您分配1万亿个数字,对应于20亿个内存页面,但这些页面中只有100万个(1e6)用于在对角线上写入。这正是你看到的4GB内存。