我对numpy.ndarray.nbytes
报道的内容感到非常困惑。
我刚创建了一个大小为100万(10 ^ 6)的单位矩阵,因此有1万亿行(10 ^ 12)。 Numpy报告说这个数组是7.28TB,但是python进程只使用了3.98GB的内存,正如OSX活动监视器所报告的那样。
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
答案 0 :(得分:5)
在Linux上(我假设在Mac下发生同样的事情),当程序分配内存时,操作系统在使用它之前并没有实际分配它。
如果程序从不使用内存,那么操作系统不必浪费RAM,但是当程序请求大量内存并且实际需要使用它时,它确实将操作系统置于某个位置,但操作系统还不够。
当发生这种情况时,操作系统可能会开始杀死次要的其他进程并将其RAM提供给请求进程,或者只是终止请求进程(这就是现在发生的情况)。
Python使用的最初4GB内存可能是numpy在单位矩阵上设置1
的页面;剩下的页面还没有被使用过。像2*x
这样的数学运算开始访问(从而取消)所有页面,直到操作系统内存不足并终止你的进程。
答案 1 :(得分:1)
系统只分配内存虚拟,只有你第一次写入这个内存,它实际上是实际使用的。对于您的示例,您分配1万亿个数字,对应于20亿个内存页面,但这些页面中只有100万个(1e6)用于在对角线上写入。这正是你看到的4GB内存。