好的,我解决了。它需要一点重构。当我传入对象引用(作为方法/函数调用的参数)时,对该引用的任何更改都会导致分配新内存。在引用超出范围之前,内存不会被释放/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 专家,但希望这可以帮助像我一样寻找内存消耗线索的人。