这个Python内存爆炸的原因是什么?

时间:2017-06-07 06:56:03

标签: python numpy memory-leaks anaconda sympy

我在一个更大的程序中有一段代码看起来像这样(变量重命名以保护无辜者):

import numpy as np
import sympy as sym
from sympy import lambdify
from sympy.core.cache import clear_cache()
#Empty array for later use. 

myarray = [[None for i in range(N)] for j in range(N)]

for i in range(N):
    for j in range(N):
        derivative = sym.diff(somearray[i], someotherarray[j])
        numericalderivative = lambdify(variablearray, derivative)
        myarray[i][j] = numericalderivative

当它运行时,它会慢慢地膨胀到绝对大量的内存(大约32 GB,可能更高)。我希望最终结果占用大量内存(N约为455,因此最终数组将有207,025个函数对象,每个函数对象都有相当多的术语)。但是,它不应该占用这个很多内存。 实际上,最终内存远低于循环期间的最大内存:更像是2 GB。

我还在第二个循环结束时尝试了一些手动垃圾收集:

del derivative
del numericalderivative
clear_cache()
gc.collect()

之前我正在使用列表解析来完成它,但是我切换到循环以查看它是否能解决内存问题,例如在必要时更容易坚持垃圾收集命令。但是,更改为列表理解确实会改变问题的表现形式:RAM显示在Windows上的已提交RAM中,而不是使用RAM。

可能的原因:

  • Sympy缓存爆炸。 Sympy以其笨重的缓存而闻名。但如果这是原因,肯定在每个循环结束时删除符号对象,然后清除Sympy缓存,会起作用吗?它没有。
  • Python免费列表爆炸。 Python可以为中间对象创建空闲列表。当然,在循环的每个步骤中删除两个对象并手动进行垃圾收集会处理这个问题吗?
  • 列表就是那么大。但是,根本不可能:当循环结束/生成数组时(在以前的版本中),内存会降低到更低的值。

在Windows 2.7和Linux中的Python 2.7(Anaconda)中都会出现此问题。

造成这种临时内存爆炸的原因是什么?

0 个答案:

没有答案