我對特定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