我有类似的代码:
def memoryIntensiveFunction(x):
largeTempVariable = Intermediate(x)
processFunction(largeTempVariable,x)
问题是变量temp
在我的测试用例中大约是500MB,但是当memoryIntensiveFunction
完成时,这个空间并没有返回给操作系统。我知道这一点是因为使用guppy
工具的内存分析表明largeTempVariable
已释放(即,在Python中),但是{memoryIntensiveFunction
是在开始运行的,再也不会运行了,所以让我不得不携带500mb的内存数小时是不方便的。在
我发现here和{a3}的一个解决方案建议使用单独的进程。多处理会产生自己的成本,但在我的案例中它是值得的。但是,这将需要重构memoryIntensiveFunction
调用方以接收x
作为返回值,而不是看到它被适当地修改。真正的杀手是我的对象x
不可选择(它大量使用了boostpython扩展)。要使x
可拾取,需要做大量的工作。在
有没有我不考虑的选择?在
这似乎很奇怪,我试图重现你的问题,似乎简单的“del”就足够了。 要演示,可以运行以下代码:
在第一个断点处,您将看到它使用了大约1gb的ram(您需要python3.3条目):
^{pr2}$在第二个断点处,删除变量后,内存被释放:
现在,如果我们删除“del”from函数,并在test()之后设置断点:
在我们终止之前,内存确实不会被释放:
那么我的建议呢?使用完吸盘后,请将其删除,不再需要;)
相关问题 更多 >
编程相关推荐