わかりました、解決しました。少しリファクタリングが必要でした。オブジェクト参照を (メソッド/関数呼び出しのパラメーターとして) 渡しているときに、その参照を変更すると、新しいメモリが割り当てられます。参照が範囲外になるまで、メモリは解放されません/gc.collect()。たとえば、問題の参照を最初に渡した関数/メソッドにコード ポインタが返され、その関数/メソッドが終了しました。
以下は、問題を説明するために費やすことができるほとんどの時間です。
_compute(self, graph):
maxValue = 5
values = {}
keeper = {}
values ["graph"] = graph.copy()
for i in range(1,1000):
self._process(values )
if values ["value"] > maxValue:
keeper = {"graph":values ["graph"], "value":values ["value"]}
_process(self, values):
graph = values["graph"]
# Do some graph processing, like make a copy, allocate some memory, add some vertex values, etc...
values["value"] = <some value, like 0 to 10>
values["graph"] = graph
参照として _process に渡された「値」オブジェクトに変更を加えると、変更されたデータの古いバージョンと新しいバージョンを保持する Python ランタイムが発生します。_compute に戻って終了するまで解放されません。
私の修正は、実際にグラフ オブジェクトを返すように _process メソッドを変更することでした。渡された参照を変更する代わりにオブジェクトを返すと、ガベージ コレクションが戻って、割り当てられたメモリが適切に解放されました。
_compute(self, graph):
maxValue = 5
values = {}
keeper = {}
values ["graph"] = graph.copy()
for i in range(1,1000):
newGraph = self._process(values )
if values ["value"] > maxValue:
keeper = {"graph":newGraph, "value":values ["value"]}
_process(self, values):
graph = values["graph"]
# Do some graph processing, like make a copy, allocate some memory, add some vertex values, etc...
values["value"] = <some value, like 0 to 10>
return graph
私の答えが最善だと言っているわけではありませんし、私は Python の専門家ではないので、何が起こっているのか手がかりさえ持っていると言っているわけではありません。