Pythonのメモリリーク

プログラムが無限ループである場合は、コードを停止しない、次のようにメモリの問題に注意を払う必要があります。
最初のリスク、枕ライブラリー

#メモリがリークします
PILインポートイメージからの

IM = Image.open(「1.JPG」)
im.save()

よりセキュアなプログラムで使用する#
PILインポートイメージから

オープン(「1.JPG」、「RB」)とOPEN_FILE AS:
    IM = Image.open(OPEN_FILE)

第二に、リスクをもたらすimportlib.reloadの使用は、グローバル変数を使用して重負荷モジュールを持って
撮影した場合、プログラムモードを再起動せずに、自動的に変更されたファイルをリロードするので、大型モジュールの必要性

run.py#
インポートのimportlib 

一方TRUE:
    モジュール名= importlib.import_module( ''、 'test_file及び')
    モジュール名= importlib.reload(モジュール名)
    の結果= module_name.main(paramsは)

#test_file.py 
global_value = { 'データリスト': []、
                '番号' ''} 
キー= '初期値' 

DEFメイン(paramsは): 
ミッションデータ搬送paramsは

    global_value [ '数'] = paramsは[ '番号'] 
    get_data1(paramsは)
    get_data2( paramsが)
    global_value返し

DEF get_data1(のparamsを):
    グローバルキー
    #プログラムのparamsによって得られた新しいデータ
    data_once = {「実行ごとに生成されたキー」:「各実行のために生成されたキー」} } 
    キー=「新しい価値」
    [ 'データリストを'] global_value。(data_once)を追加

get_data2 DEF(paramsは):
    鍵paramsは経由#プログラムと新しい値、別のデータ取得するため
    data_onceを= {「新しいキーは、各ランのために生成される」:「都度演算により生成された新たなキーが」} 
    global_value [ ' DataListコントロール「]。追加(data_once)

上記のリスクは、私は、ガベージコレクションのメカニズムは非常に信頼性が高いと思いために使用される、発生します。しかし、時に毎回過負荷モジュールは、global_valueは、新しいアドレスを使用しますが、同じアドレスでも、一度データの上に立った、解放されません
)あなたはgc.collect(各サイクルで追加した場合でも迅速に削除復元することはできませんデータたら、メモリの増加をもたらし。


私のアプローチは、
(1)内側global_valueにこの機能を転送され、上院は可変でget_data2 get_data1およびデータ統合を通過する
(2)クラス内のすべての関数は、変数のデータもグローバル生存時間を回避することができます長いです


生成されるたびにリロードが新しいメモリアドレスであるときので、概要、グローバル変数の使用は非常に簡単ですが、引数を渡さない、他の機能は再びその値を変更するには、他の関数を呼び出すことは非常に簡単ですが、それはメモリリークにつながります。

おすすめ

転載: www.cnblogs.com/7134g/p/11516818.html