0

非常に大規模なプロジェクトで、メモリ リークを探しています。これまでの私の進捗状況:

クラスカウンターを使って、

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 メソッドを使用することでした。

4

1 に答える 1

0

私の問題は、一度ではなくフレームごとに pyglet の push_handlers メソッドを使用することでした。それを取り除くと、メモリリークはなくなりました。

于 2012-08-09T10:45:40.913 に答える