モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

目次目次を開く/閉じる

objgraph による Python メモリリーク調査

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2019/08/20
最終更新最終更新
2022/01/31
記事区分記事区分
一般公開

目次

    プログラミング教育者。ScratchやPythonを教えています。

    メモリリーク時に JVM の jmap や C/C++ の Valgrind で調査できるのと同様に、Python では objgraph が便利です。

    sudo apt install graphviz
    python -m pip install xdot
    python -m pip install objgraph
    

    タイプ毎にオブジェクト数を表示

    sample.py

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    from objgraph import show_most_common_types
    
    class MyBigFatObject(object):
        pass
    
    def Main():
        obj = MyBigFatObject()
        show_most_common_types(limit=999)
    
    if __name__ == '__main__':
        Main()
    

    出力例

    $ python sample.py | grep MyBigFatObject
    MyBigFatObject             1
    

    あるタイプのオブジェクト数を表示

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    from objgraph import count
    
    class MyBigFatObject(object):
        pass
    
    def Main():
        obj = MyBigFatObject()
        print count('MyBigFatObject') #=> 1
    
    if __name__ == '__main__':
        Main()
    

    増加したオブジェクトを表示

    最後に growth/show_growth した時点からの、オブジェクトの増加数を表示できます。

    sample.py

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    from objgraph import growth
    from objgraph import show_growth
    
    class MyBigFatObject(object):
        pass
    
    def Main():
        growth()
        growth()
        obj = MyBigFatObject()
        show_growth(limit=999)
    
    if __name__ == '__main__':
        Main()
    

    出力例

    $ python sample.py
    frame                 5        +1
    MyBigFatObject        1        +1
    

    オブジェクトの参照状況を可視化

    sample.py

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    from objgraph import show_refs
    
    class MyBigFatObject(object):
        pass
    
    def Main():
        x = [1, {'mykey': 'myval'}]
        for i in range(2):
            x.append(MyBigFatObject())
        show_refs([x], filename='sample-graph.png')
    
    if __name__ == '__main__':
        Main()
    

    出力例

    Likeボタン(off)0
    詳細設定を開く/閉じる
    アカウント プロフィール画像

    プログラミング教育者。ScratchやPythonを教えています。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    >>さらに詳しくステッカーを贈る
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      ログインする

      関連記事