Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,真正释放内存,可能吗?可能是因为我';我使用命名元组?_Python_Memory Leaks_Tuples - Fatal编程技术网

Python,真正释放内存,可能吗?可能是因为我';我使用命名元组?

Python,真正释放内存,可能吗?可能是因为我';我使用命名元组?,python,memory-leaks,tuples,Python,Memory Leaks,Tuples,我继承的代码嵌套得太多,无法在这里进行解释。基本上,我定义了一个类方法,它复制一个复杂的图形结构(例如graph=NetworkX_graph.copy()),并将其作为命名元组的一部分返回 将返回的命名元组与最大值进行比较,如果它更高,则保留它。e、 g if value > max_value: best_value = {"index": index, "value": value, "graph": graph} 如何释放为复制对象分配的内存?!?我已经尝试了我能想到的一

我继承的代码嵌套得太多,无法在这里进行解释。基本上,我定义了一个类方法,它复制一个复杂的图形结构(例如graph=NetworkX_graph.copy()),并将其作为命名元组的一部分返回

将返回的命名元组与最大值进行比较,如果它更高,则保留它。e、 g

if value > max_value:
    best_value = {"index": index, "value": value, "graph": graph}
如何释放为复制对象分配的内存?!?我已经尝试了我能想到的一切。我目前正在使用内存_profiler并将@profile decorator附加到包含.copy()的方法。我正在使用的测试用例中的副本增量为7.8MB(根据具体情况可以更高或更低),并且从未发布过。它只是不断攀升,直到应用程序本身超过可用的系统内存,并开始交换到磁盘。(丑…)

我已经尝试将不再需要的元组设置为None,“del”it,然后是gc.collect()和gc.collect(2)。内存使用量不断增长

顺便说一句,我一直使用Python 2.6,我可以强制迁移到2.7


可能是因为我在使用元组吗?

好的,我解决了。它需要一些重构。当我传入对象引用(作为方法/函数调用的参数)时,对该引用的任何更改都会导致分配新内存。在引用超出范围之前,不会释放/gc.collect()内存。e、 g.代码指针返回到首先传递相关引用的函数/方法,该函数/方法退出

下面是我能花的最多时间来解释这个问题:

_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
\u计算(自身,图形):
最大值=5
值={}
守门员={}
值[“graph”]=graph.copy()
对于范围内的i(11000):
自我评价过程(价值观)
如果值[“值”]>maxValue:
keeper={“图形”:值[“图形”],“值”:值[“值”]}
_过程(自我、价值观):
图形=值[“图形”]
#做一些图形处理,比如复制,分配一些内存,添加一些顶点值,等等。。。
值[“值”]=
值[“图形”]=图形
对作为引用传递到_进程的“values”对象的任何更改都将导致Python运行时保存更改数据的新旧版本。在你回到计算机并退出之前,它不会被释放

我的修复方法是修改_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
\u计算(自身,图形):
最大值=5
值={}
守门员={}
值[“graph”]=graph.copy()
对于范围内的i(11000):
newGraph=self.\u进程(值)
如果值[“值”]>maxValue:
keeper={“图形”:新图形,“值”:值[“值”]}
_过程(自我、价值观):
图形=值[“图形”]
#做一些图形处理,比如复制,分配一些内存,添加一些顶点值,等等。。。
值[“值”]=
返回图

我并不是说我的答案是最好的,也不是说我对正在发生的事情有所了解,因为我不是Python专家,但希望这能帮助像我一样寻找内存消耗方面的线索。

其他地方可能有人引用了它。感谢quck的回复。当我执行NetworkX\u graph.copy()时,内存分析器会增加,这很有意义。已经实现了很多与该副本一起使用的功能。(正在讨论的方法是复制对象的一部分。例如,self.process_something())知道我如何(在PDB或其他方式中)确定引用对象的是什么吗?也许嗯。。。sys.getrefcount(在我的元组上)为我提供了4个引用。sys.getrefcount(在我的元组[“复制的图”]上)为我提供了3个引用。使用gc.get\u referers(在我的元组上)返回相当长的输出。(那个NetworkX图形毕竟占用了7.8MB)我如何或者说我可以判断哪些引用是阻止gc收集对象的引用?我在这里有点不知所措,我知道如果没有一个例子,这是不容易帮助的,所以任何建议都是非常感谢的!垃圾收集器将回收最终未被某个“根”对象引用的任何对象,根对象是类似全局对象的对象。我会尝试删除引用(以您从
get\u referers
获得的列表为指导),直到对象消失,也许其他人有更好的解决方案。