どのPythonメモリプロファイラーが推奨されますか?[閉まっている]


668

私のPythonアプリケーションのメモリ使用量を知りたいので、具体的には、どのコードブロック/部分またはオブジェクトがほとんどのメモリを消費しているのか知りたいです。Google検索では、商用のものがPython Memory Validator(Windowsのみ)であることを示しています。

そしてオープンソースのものはPySizerHeapyです。

私は誰も試したことがないので、どれを検討するのが最善かを知りたいと思いました。

  1. ほとんどの詳細を示します。

  2. コードに変更を加える必要はありません。


2
リークの原因を見つけるには、objgraphをお勧めします。
pi。

9
@MikeiLLこれらのような質問のための場所があります:ソフトウェアの推奨事項
Poik

2
これは頻繁に発生しているため、代わりに1つの質問を別のフォーラムに移行できます。
zabumba

1つのヒント:誰かがgaeを使用してメモリ使用量をチェックしたい場合-これらのツールが何も出力しないか、イベントが開始されなかったため、それは大きな頭痛の種です。小さなものをテストしたい場合は、テストしたい関数を別のファイルに移動し、このファイルを単独で実行します。
alexche8

4
私はpympler
zzzeek

回答:


287

Heapyの使い方は非常に簡単です。コードのある時点で、次のように記述する必要があります。

from guppy import hpy
h = hpy()
print(h.heap())

これにより、次のような出力が得られます。

Partition of a set of 132527 objects. Total size = 8301532 bytes.
Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
0  35144  27  2140412  26   2140412  26 str
1  38397  29  1309020  16   3449432  42 tuple
2    530   0   739856   9   4189288  50 dict (no owner)

オブジェクトがどこから参照されているかを調べて、それに関する統計を取得することもできますが、どういうわけか、そのドキュメントは少し疎です。

Tkで書かれたグラフィカルブラウザーもあります。


24
Python 2.7を使用している場合は、そのトランクバージョンが必要になる場合があります。sourceforge.net / tracker /… 、pip install https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy
James Snyder

27
heapy docsは...良くない。しかし、私はこのブログ投稿が開始するのに非常に役立つことがわかり
Joe Shaw

4
heapyには、Python拡張機能で割り当てられたメモリは含まれません。誰かがboost::pythonオブジェクトをインクルードするためのメカニズムを考案した場合、いくつかの例を見るとよいでしょう!
アモス2014

34
2014年7月6日の時点で、グッピーは、Python 3をサポートしていません
クエンティンPradetの

5
guppy3と呼ばれるPython 3をサポートするguppyのフォークがあります。
David Foster

384

誰もそれについて言及していないので、メモリ使用量の行ごとのレポートを出力でき、UnixとWindowsで動作する私のモジュールmemory_profilerをポイントします(この最後の1つにはpsutilが必要です)。出力は非常に詳細ではありませんが、目的は、割り当てられたオブジェクトの徹底的な分析ではなく、コードがより多くのメモリを消費している場所の概要を示すことです。

関数を装飾@profileして-m memory_profilerフラグを付けてコードを実行すると、次のような行ごとのレポートが出力されます。

Line #    Mem usage  Increment   Line Contents
==============================================
     3                           @profile
     4      5.97 MB    0.00 MB   def my_func():
     5     13.61 MB    7.64 MB       a = [1] * (10 ** 6)
     6    166.20 MB  152.59 MB       b = [2] * (2 * 10 ** 7)
     7     13.61 MB -152.59 MB       del b
     8     13.61 MB    0.00 MB       return a

1
私のユースケース-たまたまカーソルを開いたままにしておく複雑なシステムではなく、単純な画像操作スクリプト-これは最良の解決策でした。コードに追加された最小限の問題で、ドロップインして何が起こっているのかを理解するのは非常に簡単です。迅速な修正に最適で、おそらく他のアプリケーションにも最適です。
ドリフトキャッチャー2013

10
memory_profilerは本当にシンプルで使いやすいと思います。オブジェクトごとではなく、行ごとにプロファイリングを行いたい。書いてくれてありがとう。
tommy.carstensen 2013

1
@FabianPedregosaはどのようにmemory_profilerがループを処理するか、それはループ反復数を識別できますか?
グレンフレッチャー

3
ループを識別するのは、行ごとの量を報告しようとして、重複した行を見つけた場合だけです。その場合、それはすべての反復の最大値を取ります。
Fabian Pedregosa 2014年

1
@FabianPedregosa memory_profilerその出力をバッファリングしますか?何か間違っている可能性がありますが、関数が完了したときにプロファイルをダンプするのではなく、スクリプトが終了するのを待ちます。
Greenstick

80

私はダウザーをお勧めします。設定は非常に簡単で、コードを変更する必要はありません。単純なWebインターフェースから、時間ごとに各タイプのオブジェクトの数を表示したり、ライブオブジェクトのリストを表示したり、ライブオブジェクトへの参照を表示したりできます。

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.server.quickstart()
    cherrypy.engine.start(blocking=False)

memdebugをインポートし、memdebug.startを呼び出します。それで全部です。

PySizerやHeapyは試していません。他の人のレビューをお願いします。

更新

上記のコードはに対するものCherryPy 2.XCherryPy 3.Xserver.quickstartメソッドは削除されておりengine.startblockingフラグを取得しません。だからあなたが使っているならCherryPy 3.X

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.engine.start()

3
しかし、それはcherrypyだけのためのものですか?それをsinpleスクリプトでどのように使用するのですか?
Anurag Uniyal 2008

13
これはCherryPy用ではありません。CherryPyをGUIツールキットと考えてください。
sanxiyn 2008

1
fwiw、pysizerページpysizer.8325.orgheapyを推奨しているようです。これは類似していると言われています
Jacob Gabrielson

6
Dozerと呼ばれるDowserの汎用WSGIポートがあり、他のWebサーバーでも使用できます。pypi.python.org/ pypi / Dozer
Joe Shaw

2
cherrypy 3.1はcherrypy.server.quickstart()を削除したため、cherrypy.engine.start()を使用するだけ
MatsLindh

66

考えてみましょうobjgraphのライブラリを(参照http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks(使用例)。


7
objgraphは、今日直面していたメモリリークの問題を解決するのに役立ちました。objgraph.show_growth()は特に便利
でした

1
私も、objgraphが本当に便利だと感じました。objgraph.by_type('dict')これらのすべての予期しないdictオブジェクトがどこから来ているのかを理解するようなことを行うことができます。
ディノ2013

18

Muppyは(まだ別の)Python用のメモリ使用量プロファイラーです。このツールセットの焦点は、メモリリークの特定に置かれています。

Muppyは、開発者がPythonアプリケーションのメモリリークを特定できるように支援します。実行時のメモリ使用量の追跡と、リークしているオブジェクトの識別を可能にします。さらに、リリースされていないオブジェクトのソースを特定できるツールが提供されます。


13

memprofと呼ばれるPython用のメモリプロファイラーを開発しています。

http://jmdana.github.io/memprof/

デコレートされたメソッドの実行中に、変数のメモリ使用量をログに記録してプロットできます。以下を使用してライブラリをインポートする必要があります。

from memprof import memprof

そして、以下を使用してメソッドを装飾します。

@memprof

これは、プロットの例です。

ここに画像の説明を入力してください

プロジェクトはGitHubでホストされています。

https://github.com/jmdana/memprof


3
どうやって使うの?a、b、cとは何ですか?
tommy.carstensen 2013

@ tommy.carstensen abおよびc変数の名前です。ドキュメントはgithub.com/jmdana/memprofにあります。質問がある場合は、githubで問題を送信するか、ドキュメントにあるメーリングリストにメールを送信してください。
jmdana 2013


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.