2011-08-09 10 views
29

大規模なPythonコードベースから、関数の実行中にヒープ使用量やメモリ割り当ての概要を生成したいと考えています。Pythonの行単位のメモリプロファイラ?

私はheapyに精通しています。コード内の特定のポイントでヒープの「スナップショット」を取ってくれてうれしく思いますが、それ。私もline_profilerで遊んだことがあるが、それはメモリではなく実行時に機能する。

今私のフォールバックはmassifのValgrindですが、Heapyとline_profilerの両方が与えるコンテキスト上のPython情報はほとんどありません。 Pythonプログラムの実行スパン上でのメモリ使用量やヒープの増加を示す、後者の2つの組み合わせがありますか?

+0

C言語で気になることがあればhttp://docs.python.org/devguide/gdb.htmlでそれを実行できますか? – agf

+0

定期的な間隔でgdbを自動的に実行する方法があれば、CのパースペクティブはOKです。そのような方法はありますか? – Tim

+1

良い質問です、私は知りたいと思うので、私は賞金を追加しました。 – bgw

答えて

13

私は、カスタムトレーサ機能を登録するには、プログラムの起動時にsys.settraceを使用します。 custom_trace_functionはコード行ごとに呼び出されます。その後、その機能を使用して、heapyまたはmeliaeによって収集された情報を後で処理するためにファイルに格納することができます。

import sys 
import time 
import atexit 
from guppy import hpy 

_last_log_time = time.time() 
_logfile = open('logfile.txt', 'w') 

def heapy_profile(frame, event, arg): 
    currtime = time.time() 
    if currtime - _last_log_time < 1: 
     return 
    _last_log_time = currtime 
    code = frame.f_code 
    filename = code.co_filename 
    lineno = code.co_firstlineno 
    idset = hpy().heap() 
    logfile.write('%s %s:%s\n%s\n\n' % (currtime, filename, lineno, idset)) 
    logfile.flush() 

atexit.register(_logfile.close) 
sys.settrace(heapy_profile) 
+1

まだ試したことはありませんが、勝者がいるようです。 (誰かがこの質問に試してみたいと思っている場合には、賞金を授与するために賞金終了まで待つつもりです) – bgw

4

あなたはmemory_profilerにより興味があるかもしれない:

はここhpy.heapの出力()、プレーンテキストファイルに各秒を記録します非常に簡単な例です。

関連する問題