我使用下面的简单代码在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')
感谢您对此有任何可理解的解释。
编辑:以及解决问题的方法。
答案 0 :(得分:2)
我相信您可以使用try
函数解决此问题。
np.arange
当我通过将list-comprehension(即列表)传递给vector1 = np.arange(scale)
构造函数来构建numpy数组时,我正在重现相同的行为。 问题是,用作参数的列表显然没有被垃圾收集。我只能猜测为什么。
该列表正在删除,因为它的引用为零。 Python将内存返回到堆,在创建新对象时可以使用它。堆不会立即将内存返回给系统。这就是进程内存使用量仍然很高的原因。