0

私は実際に私のpythongtkアプリ内で私のメモリの問題を修正しようとしています。

Pythonでのメモリ使用量に関する多くの記事を読みましたが、すべてを理解することはできません。ここで私を助けていただければ幸いです。

したがって、アプリケーションを起動して設定ウィンドウを開くと、32368KBのmem使用量になります。

設定ウィンドウを閉じると、memの使用量も32368KBになります。

設定ウィンドウを開いたり閉じたりするコード例を次に示します。

main.py

...
    def show_settings(self):
        self.settings = Settings()
        self.settings.window.connect("destroy", self.clear_settings)

    def clear_settings(self, widget, Data=None):
        del self.settings


class Settings():
    def __init__():
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        ...

ここで、iveはobjgraphを使用して生きている参照を分析しようとしました。それが結果です:

設定ウィンドウを開く

設定ウィンドウを開く

設定ウィンドウを閉じた後

設定を閉じた後

誰かがmemを解放する方法を手伝ってもらえますか?

4

2 に答える 2

2

Python でのメモリ割り当ては、複数のレベルで発生します。まず、C ライブラリのシステム アロケータ コンポーネントによってシステムからメモリが割り当てられます (これは、Unix psまたは Windowsタスク マネージャによって提供されるメモリ使用量の数値に表示されます)。その割り当てられたメモリは、mallocなどの C ライブラリ呼び出しによって小さなチャンクで割り当てられます。これは、Python 独自のメモリ アロケータ (オブジェクトを格納するため) によってさらに小さなチャンクが割り当てられます。さらに、Python は、さまざまなオブジェクトに対してさまざまな割り当てプールを維持します (特定のオブジェクト、たとえばstrintを最適化するため)。

メモリをシステムに戻すには、Python のアロケータで割り当てを解除し、次に C ライブラリのヒープ アロケータとページ アロケータで割り当てを解除する必要があります。実行しているシステム、C ライブラリのバージョン、Python 自体のバージョン、アプリケーションの割り当てパターンなど、多くの要因に依存するため、これがいつ発生するかを判断するのは困難です。

アロケータは通常、新しいメモリが必要になるたびにシステム コール (コストがかかる) を行わないようにすることで割り当てを高速化するために、いくらかの空きメモリ (フリー リストと呼ばれる) を保持します。各アロケータには、メモリが実際に次のレベルから割り当てられるか解放されるかを決定するいくつかのしきい値があります。

したがって、オブジェクトを削除することによってシステム メモリの割り当て (つまり、 ps /タスク マネージャーの出力) が変化することを期待することはできません。

特定のメモリ割り当ての問題があり、一部は巨大な一時オブジェクトであり、時間の経過とともにメモリ使用量を最小限に抑えたい場合は、より具体的な質問をする必要があります:)

于 2013-01-29T11:24:32.867 に答える
0

ここには何も問題はありません。Settings解放後にインスタンスが消失しましたが、これは正常な動作です。メモリ使用量をどのように測定していますか?

于 2013-01-29T11:17:32.090 に答える