私は、特定のpythonスクリプトのメモリ使用量について完全に混乱しています。私は実際にはいくつかの質問advice/Answersからadviceにもかかわらず、使用法をプロファイルする方法を知っていないと思います。Pythonでのメモリ使用量:memory_profilerとguppyの違いは何ですか?
私の質問はmemory_profiler
とguppy.hpy
の違いは何ですか?なぜ私は大量のメモリを使用していると言っているのですが、もう1つは私にはないと言っているのですか?
私はpysam
というバイオインフォマティクスのSAM/BAMファイルにアクセスするためのライブラリを使用しています。私の主なスクリプトは、SAM(ASCII)からBAM(Binary)に変換してその間のファイルを操作するときに、すぐにメモリ不足になります。
私は、各ステップでどれだけのメモリが割り当てられるかを理解するための小さなテストの例を作成しました。次に@profile
デコレータをコメントアウトとguppy
関連する行のコメントを解除
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
、私は次の出力(python test_pysam.py
)を得る:以下の出力でmemory_profiler(python -m memory_profiler test_pysam.py
)結果とメモリ使用量を監視
# 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)
。
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
1つのケースでは、ライン13の合計サイズは529.03 MBですもう一方は624バイトです。実際にここで何が起こっているのですか? 'test.sam'は〜52MBのSAMファイル(やはりASCII形式)です。それはsamtools
に関連するCライブラリのラッパーなので、pysam
を深く掘り下げるのはちょっと難しいことです。実際にSamfile
が何であるかにかかわらず、私はそれを作成するためにどれくらいのメモリが割り当てられているかを知ることができるはずです。私の大規模で複雑なPythonプログラムの各ステップのメモリ使用量を正確にプロファイルするためには、どのような手順をとるべきですか?
「test.sam」は、はるかに長い名前だったので2行目にあります。一度変更すると、ファイル名を1行にすると行番号情報がオフになることがわかりました。 – Yann