我对特定python脚本的内存使用情况感到十分困惑。尽管advice来自几个SO Questions/Answers,但我想我真的不知道如何剖析使用情况。Python中的内存使用情况:memory_profiler和guppy之间有什么区别?
我的问题是:memory_profiler
和guppy.hpy
有什么区别?为什么一个人告诉我我正在使用大量的记忆,另一个告诉我我不是?
我正在与pysam
合作,这是一个用于访问生物信息学SAM/BAM文件的库。将SAM(ASCII)转换为BAM(二进制)并处理它们之间的文件时,我的主脚本快速耗尽内存。
我创建了一个小测试示例来了解在每个步骤中分配了多少内存。
# test_pysam.py:
import pysam
#from guppy import hpy
TESTFILENAME = ('/projectnb/scv/yannpaul/MAR_CEJ082/' +
'test.sam')
#H = hpy()
@profile # for memory_profiler
def samopen(filename):
# H.setrelheap()
samf = pysam.Samfile(filename)
# print H.heap()
pass
if __name__ == "__main__":
samopen(TESTFILENAME)
监测与memory_profiler(python -m memory_profiler test_pysam.py
)的结果在下面的输出内存使用情况:
Filename: test_pysam.py
Line # Mem usage Increment Line Contents
================================================
10 @profile # for memory_profiler
11 def samopen(filename):
12 10.48 MB 0.00 MB # print H.setrelheap()
13 539.51 MB 529.03 MB samf = pysam.Samfile(filename)
14 # print H.heap()
15 539.51 MB 0.00 MB pass
然后注释掉@profile
装饰和取消注释guppy
相关的线,我得到下面的输出(python test_pysam.py
):
Partition of a set of 3 objects. Total size = 624 bytes.
Index Count % Size % Cumulative % Kind (class/dict of class)
0 1 33 448 72 448 72 types.FrameType
1 1 33 88 14 536 86 __builtin__.weakref
2 1 33 88 14 624 100 csamtools.Samfile
第13行的总大小为529.03 MB在一个案例中另一个是624字节。这里究竟发生了什么? 'test.sam'是一个〜52MB的SAM(同样是一个ASCII格式)文件。对我来说,深入探究pysam
有点棘手,因为它是一个与samtools
相关的C库的封装。不管实际是什么,我认为我应该能够学习分配多少内存来创建它。我应该使用什么过程来正确分析我的更大,更复杂的python程序的每一步的内存使用情况?
请注意'test.sam'在第二行,因为它是一个更长的名称,一旦我改变它,我意识到我的行号信息将关闭,如果我把文件名放在一行上。 – Yann