非常に大規模なプロジェクトで、メモリ リークを探しています。これまでの私の進捗状況:
クラスカウンターを使って、
import gc
from collections import Counter
def count():
return Counter(type(o).__name__ for o in gc.get_objects())
プログラムのレンダー パスごとに、dict と instancemethods が得られることがわかります。
Counter({'instancemethod': 9714, 'dict': 7274, ...
Counter({'instancemethod': 9716, 'dict': 7275, ...
Counter({'instancemethod': 9718, 'dict': 7276, ...
Counter({'instancemethod': 9720, 'dict': 7277, ...
次に、ガベージ コレクションを取得していない追加の dict を特定しようとしました。
def get_latest():
for e in gc.get_objects():
if type(e).__name__ == "dict":
latest = e
return latest
残念ながら、それはほとんど同じものを返すため (dict1 は dict2 です)、リストの最後ではありません。
リークを見つける方法についての指針をいただければ幸いです。Python 2.7 とブリーディング エッジ pyglet を使用しています。
また、これはゲームのクライアントにのみ影響し、サーバーには影響しません。pyglet 内の問題かもしれませんが、それでも見つけたいと思います。
編集: この質問は自分で答えています。私の問題は、1 回ではなくフレームごとに pyglet の push_handlers メソッドを使用することでした。