2012-08-09 11 views
15

Pythonでオブジェクトへの参照をすべて見つけるには良い方法はありますか?Pythonでオブジェクトへの参照をすべて見つける

私が尋ねる理由は、「メモリリーク」があるように見えるからです。ウェブブラウザから画像ファイルをサーバにアップロードしています。これを行うたびに、メモリの使用量は、アップロードされたばかりのファイルのサイズに比例して増加します。このメモリはPythonのガベージコレクションでは決して公開されていないので、削除されたり、スコープから外れたりすることのない画像データを指していると思われます。

私は、Pythonに「このメモリを参照している参照は何ですか?」と聞くことができればいいと思います。私はガベージコレクションがそれを解放しないようにしているのを理解することができます。

現在、私たちはPythonとDjangoをHerokuサーバ上で実行しています。

ご意見ありがとうございます。ありがとうございます!

+0

http://stackoverflow.com/questions/1339293/python-memory-leak-debugging –

+0

これを見てきましたか:http://stackoverflow.com/questions/110259/python-memory-profiler –

答えて

10

Pythonの標準ライブラリには、ガベージコレクタAPIを含むgcモジュールがあります。可能な機能の1つは、

gc.get_objects() 

です。この関数は、現在ガベージコレクタによって追跡されているすべてのオブジェクトのリストを返します。次のステップはそれを分析することです。

、あなたがsysモジュールのgetrefcount機能を使用することができます追跡したいオブジェクトを知っている場合:

>>> x = object() 
>>> sys.getrefcount(x) 
2 
>>> y = x 
>>> sys.getrefcount(x) 
3 
+9

sys.getrefcount ()は便利ですが、その参照が何であるかを見る方法はありますか? – RAAC

12

Pythonのgcモジュールは、いくつかの便利な機能を持っていますが、gc.get_referrers()は、あなたが探しているものであるように聞こえます。ここでは例です:

import gc 


def foo(): 
    a = [2, 4, 6] 
    b = [1, 4, 7] 

    l = [a, b] 
    d = dict(a=a) 
    return l, d 

l, d = foo() 
r1 = gc.get_referrers(l[0]) 
r2 = gc.get_referrers(l[1]) 

print r1 
print r2 

私がいることを実行すると、私は次の出力を参照してください。

[[[2, 4, 6], [1, 4, 7]], {'a': [2, 4, 6]}] 
[[[2, 4, 6], [1, 4, 7]]] 

あなたが最初の行はldで、2行目がちょうどlであることがわかります。

私の簡単な実験では、結果は必ずしもきれいではないことがわかりました。例えば、インターンされた文字列やタプルには、あなたが期待する以上のリファラーがあります。

+1

これは最も簡単で最善の答えです。 –

関連する問題