特定の Python スクリプトのメモリ使用量について完全に混乱しています。いくつかの SO Questions/ Answersからのアドバイスにもかかわらず、使用法をプロファイルする方法が本当にわからないと思います。
私の質問は次のとおりです。との違いは何ですか? 1 つは大量のメモリを使用していると言われ、もう 1 つはそうではないと言われるのはなぜですか?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
に関連する C ライブラリのラッパーであるため、 を深く掘り下げるのは少し難しいですsamtools
。が実際に何であるかに関係なく、Samfile
それを作成するためにどれだけのメモリが割り当てられているかを知ることができるはずだと思います。大規模で複雑な Python プログラムの各ステップのメモリ使用量を正しくプロファイリングするには、どの手順を使用すればよいですか?