我有一个包含大量对象的程序,其中许多是Numpy数组.我的程序很糟糕地交换,我正在尝试减少内存使用量,因为它实际上无法在我的系统上使用当前的内存要求.
我正在寻找一个很好的分析器,它可以让我检查各种对象消耗的内存量(我正在设想与cProfile相对应的内存),以便我知道在哪里进行优化.
我听说过关于Heapy的不错的东西,但遗憾的是Heapy不支持Numpy数组,而且我的大多数程序都涉及Numpy数组.
我有一个numpy脚本 - 根据top- 使用大约5GB的RAM:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
16994 aix 25 0 5813m 5.2g 5.1g S 0.0 22.1 52:19.66 ipython
Run Code Online (Sandbox Code Playgroud)
是否有内存分析器可以让我了解占用大部分内存的对象?
我试过了heapy,但是guppy.hpy().heap()给了我这个:
Partition of a set of 90956 objects. Total size = 12511160 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 42464 47 4853112 39 4853112 39 str
1 22147 24 1928768 15 6781880 54 tuple
2 …Run Code Online (Sandbox Code Playgroud) 最近这一点刺痛了我.我通过删除代码中列表的numpy数组的所有比较来解决它.但为什么垃圾收集器会错过收集呢?
运行它,看它吃你的记忆:
import numpy as np
r = np.random.rand(2)
l = []
while True:
r == l
Run Code Online (Sandbox Code Playgroud)
在64位Ubuntu 10.04上运行,virtualenv 1.7.2,Python 2.7.3,Numpy 1.6.2
为了测试 Pypy JIT 明显更快的说法,我编写了一个简单的代码,该代码重复添加两个大小为 1200x1200 的数组。我的代码如下
import numpy as np
import random
a=np.zeros((1200, 1200), dtype=np.float32)
b=np.zeros((1200, 1200), dtype=np.float32)
import timeit
#Start timer
start=timeit.default_timer()
#Initialize the arrays
for j in range(1200):
for k in range(1200):
a[j][k]=random.random()
b[j][k]=random.random()
#Repeatedly add the arrays
for j in range(10):
a=np.add(a,b)
#Stop timer and display the results
stop=timeit.default_timer()
print stop-start
Run Code Online (Sandbox Code Playgroud)
对于普通的 python,执行时间约为 1.2 - 1.5 秒。但是使用 Pypy 它会超过 15 秒吗?同样在上述情况下,我只添加了 10 次数组。如果我将此值增加到 1000,我的计算机将停止响应。我发现这是因为使用 pypy 时几乎消耗了整个 RAM。难道我做错了什么?或者问题是其他的?