python-3.x - Python 占用的内存是应有的六倍

标签 python-3.x ubuntu memory memory-management

我使用下面的简单代码在 python 中生成了一个 numpy 数组。当我在控制台中打印出对象大小时,我得知该对象正在使用 228 MB 内存。但是当我查看我的实际 RAM 发生了什么时,我得到了一个非常不同的结果。在系统监视器的资源选项卡中,我可以看到生成此数组时内存使用量增加了 1.3 GB。为了确保它是由 python 引起的,我还查看了进程选项卡。那里也一样。进程“python3.5”在脚本需要完成的 10 秒内将其内存使用量增加到 1.3 GB。

这意味着 python 占用的内存几乎是该对象的六倍。我会理解管理对象的一定内存开销,但不会增加 6 倍。我没有找到一个可以理解的解释为什么我不能使用 python 来例如读入的文件,比我内存的六分之一大。

import sys
import numpy as np
scale = 30000000
vector1 = np.array([x for x in range(scale)])
# vector1 = np.array(list(range(scale))) # same thing here
print(((sys.getsizeof(vector1)/1024)/1024.0), 'MB')

感谢您对此提供任何可以理解的解释。

Edit: And for solutions to fix it.

最佳答案

我相信您可以使用 np.arange 来解决此问题功能。

vector1 = np.arange(scale)

当我通过将列表理解(即列表)传递给 np.array 来构建 numpy 数组时,我重现了相同的行为构造函数。问题是显然用作参数的列表没有被垃圾收集。我只能推测为什么。

tdelenay 的评论

该列表正在被删除,因为它的引用变为零。 Python 将内存返回到堆中,在创建新对象时可以使用它。堆不会立即将内存还给系统。这就是为什么进程内存使用率仍然很高的原因。

关于python-3.x - Python 占用的内存是应有的六倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40185951/

相关文章:

python - 到达 x_cor : 0 时无法使玩家反弹

c++ - 为什么这个C++程序会导致内存泄漏?

c++ - 清除标准输入缓冲区(内存占用)

python - 如何绘制我的数据框(python 和 pandas)

python - 从私有(private) Git 存储库进行 Pip 安装,在 Git URL 中使用个人访问 token

git - 无法从 Virtualbox 内的 Ubuntu 服务器上的 git 中提取

c++ - 我的 friend 无法在他的 Linux 发行版上运行我的 openGL 程序

vim - 重新安装 Vim

java - JBoss Drools 从 DRL 插入事实

python - 是什么导致 "AttributeError: ' numpy.ndarray' 对象没有属性 'diff' “