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

标签 python numpy matrix

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/

相关文章:

python - 如何查询给定条件的先前项目

python - 如何解决重定向中的编码问题

Python:在主内存不足时引发异常

c++ - 将 cv::Mat A 的每个成员与 cv::Mat B 合并,以创建一个带有 [a(x,y),b(x,y)] 的 cv::Mat C

python - 字典的 clear() 方法是否会从内存中删除所有与项目相关的对象?

python - 如何查找从 .csv 文件创建的列表中的单词频率

arrays - 在一维数组上使用 numpy_where

python - 加快 Numpy/Python 中的最小搜索速度

python Pandas : transforming - moving values from diagonal

java - 如何在 2d ArrayList 中找到对角线元素的总和?