関数に渡す必要のあるこの巨大なオブジェクト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がグローバル変数として定義されていないと表示されます。
それを行う方法はありますか?ありがとう!
del A
は、A
のローカルスコープからfunction
を削除するだけです( この回答 を参照)。 A
は引き続きグローバルスコープに保持されます。グローバルスコープから削除するには、クロージャを使用する(そしてglobal A
を宣言する)か、python3
でキーワードnonlocal
を使用することもできます。ただし、これはスコープからバインディングを削除するだけであり、対応するメモリが解放されることを保証するものではありません。これは、オブジェクトがガベージコレクションの場合に発生します。 gc
モジュールを介してガベージコレクションを強制できます( この回答 を参照)。
ただし、メモリの問題が発生している場合は、データセット全体をロードする代わりに、データセットのビューを使用して、一度にその一部のみを処理(ロード)する(つまり、データをストリーム処理する)ことができます。
関数が戻ると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)
を呼び出すだけです。
関数内でAを再割り当てすると、探している効果が得られると思います。
def function(A):
B = transform(A)
A = None
B = compute(B)
return(B)
外部変数をグローバルとして宣言する
a = 1
def func():
global a
print(a)
del a
func()
print(a)