726

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

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

私は誰も試したことがないので、次の点を考慮してどれが最適かを知りたいと思いました。

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

  2. コードに変更を加える必要はほとんどないか、まったくありません。

4

8 に答える 8

461

私のモジュールmemory_profilerは、メモリ使用量の行ごとのレポートを出力することができ、Unix と Windows で動作します (この最後のものでは 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
于 2012-05-14T22:51:16.357 に答える
306

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

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で書かれたグラフィカルブラウザもあります。

Python 2.xの場合は、Heapyを使用します。

于 2008-09-21T11:45:39.977 に答える
85

ダウザーをお勧めします。セットアップは非常に簡単で、コードを変更する必要はありません。シンプルな 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.startを取りません。blockingしたがって、使用している場合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()
于 2008-09-21T04:50:55.013 に答える
19

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

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

于 2013-03-11T14:17:42.353 に答える
14

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

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

装飾されたメソッドの実行中に、変数のメモリ使用量をログに記録してプロットすることができます。以下を使用してライブラリをインポートするだけです。

from memprof import memprof

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

@memprof

これはプロットがどのように見えるかの例です:

ここに画像の説明を入力

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

https://github.com/jmdana/memprof

于 2013-07-03T12:12:50.307 に答える
12

meliaeは Heapy や PySizer よりもはるかに機能的であることがわかりました。たまたま wsgi webapp を実行している場合、Dozer は Dowser優れたミドルウェア ラッパーです。

于 2011-10-25T21:31:15.557 に答える