web-dev-qa-db-ja.com

Python-関数内から変数を削除(メモリから削除)しますか?

関数に渡す必要のあるこの巨大なオブジェクトA(almsot 10goに重みを付けることができます)をロードする必要があります。このオブジェクトからパラメーターBを抽出して、さらに重い計算を実行します。

_A = load(file)

def function(A):    
   B = transorm(A)    
   B = compute(B)
   return(B)
_

一部のメモリを解放するために(すでにMemoryErrorがあったため)、Bに変換した直後にメモリからAを削除したいと思います。delを試しましたが、表示されません。スクリプトレベルでAの存在に影響を与えます。 del global()["A"]も試しましたが、Aがグローバル変数として定義されていないと表示されます。

それを行う方法はありますか?ありがとう!

5

del Aは、Aのローカルスコープからfunctionを削除するだけです( この回答 を参照)。 Aは引き続きグローバルスコープに保持されます。グローバルスコープから削除するには、クロージャを使用する(そしてglobal Aを宣言する)か、python3でキーワードnonlocalを使用することもできます。ただし、これはスコープからバインディングを削除するだけであり、対応するメモリが解放されることを保証するものではありません。これは、オブジェクトがガベージコレクションの場合に発生します。 gcモジュールを介してガベージコレクションを強制できます( この回答 を参照)。

ただし、メモリの問題が発生している場合は、データセット全体をロードする代わりに、データセットのビューを使用して、一度にその一部のみを処理(ロード)する(つまり、データをストリーム処理する)ことができます。

1
a_guest

関数が戻るとAはスコープ外になり、同じ方法でメモリを占有しなくなるため、おそらく関数内からオブジェクトをロードすると、ここで機能します(Aはおそらくまだ存在します)メモリ内にありますが、そのメモリは必要に応じて他の用途に再び使用できるようになります)。たぶん試してみてください何かこのように:

_f = file                 # assuming file is not the memory hog

def function_A(file):
    A = load(file)       # A is created in the local scope of the function
    return transform(A)  # A will go out of scope, freeing the memory for use

def function_B(file): 
   B = function_A(file)  # when this returns the memory should be available again
   return compute(B)
_

次に、function_B(file)を呼び出すだけです。

0
Totem

関数内でAを再割り当てすると、探している効果が得られると思います。

def function(A):
    B = transform(A)
    A = None
    B = compute(B)
    return(B)
0
Kumar

外部変数をグローバルとして宣言する

a = 1

def func():
    global a
    print(a)
    del a

func()
print(a)
0
the_dangoria