我想知道我的Python应用程序的内存使用情况,并且特别想知道哪些代码块/部分或对象占用了大部分内存.Google搜索显示商业广告是Python Memory Validator(仅限Windows).
我没有尝试任何人,所以我想知道哪一个是最好的考虑:
提供大部分细节.
我必须对代码进行最少或不做任何更改.
我有一个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) 在我的应用程序中,生成了100个numpy数组(每个1000个复杂元素)并填充了数据.然后经过多次迭代,一遍又一遍地修改数组元素.在初始生成之后,系统监视器报告大约50 Mb的RAM使用情况.虽然我没有生成任何新阵列,但每次迭代的足迹仍然增长了大约40 Mb.
我在这里学到,垃圾收集器不处理numpy数组.所以我假设我正在生成一些操作数据的临时数组没有正确收集.
不幸的是,这里说guppy.hpy().heap()无法帮助分析numpy.
如何识别问题的根源并理想地保持消耗在任何次数的迭代中保持不变?
我怀疑在分配这里描述的数组元素时可能会生成副本,然后不会进行垃圾回收.
我可以手动处理临时numpy数组以协助垃圾回收吗?
[更新1]:示例代码
这段代码被称为数千次.每次,足迹都会增加.我不明白为什么,因为根据我的理解,它只是读取现有数组并操纵其他现有数组.这些切片操作中的任何一个都是无意中做的吗?(对不起行长.我可以简化它,但我可能也会隐藏我的错误.)
for ts in np.arange(numTimeslots):
for fc in np.arange(numFreqChunks):
interfencep = np.sum( np.dot(np.dot(self.baseStations[bs].cells[cell].CSI_OFDMA[:,:,fc,ts] ,np.diag(cell.OFDMA_power[:,fc,ts])),self.baseStations[bs].cells[cell].CSI_OFDMA[:,:,fc,ts].conj().T) for bs in self.baseStations for cell in bs.cells if cell != self._cell)
noisep = np.eye(self.antennas) * (self.noisePower / numFreqChunks)
self.OFDMA_interferenceCovar[:,:,fc,ts] = noisep + interfencep
self.OFDMA_EC[:,:,fc,ts] = (np.dot(np.dot(self.OFDMA_CSI[:,:,fc,ts],linalg.inv(noisep+interfencep)),self.OFDMA_CSI[:,:,fc,ts].conj().T))
eigs = linalg.eig(self.OFDMA_EC[:,:,fc,ts])[0]
self.OFDMA_SINR[:,fc,ts] = np.real(eigs)
Run Code Online (Sandbox Code Playgroud)
[更新2]:对于那些好奇的人来说,这是移动网络模拟器的一部分.运行virtualenv,Python 2.7.3,Numpy 1.6.2,SciPy 0.11.0b1
[更新3]:通过评论和检查系统监视器,我可以将'interferencep = ...' - 行识别为罪魁祸首.它分配了大量未释放的内存.但为什么?
确定运行我的脚本的计算机是否正在使用交换内存的最佳方法是什么?它应该尽可能地跨平台。一种解决方案是像top子进程一样运行程序,但我希望有更好的方法。