SciPy网格数据内存泄漏(版本0.12.0)



我在循环中使用scipy.interpolate.griddata,它导致Python在每个循环中积累内存。这是在Mac OS X 10.6.8上使用Python 2.7.5和SciPy 0.12.0(通过Mac端口安装)。

下面的代码改编自scipy.interpolate.griddata参考指南,说明了我的观点。

import numpy as np
from scipy.interpolate import griddata
def func(x, y):
    return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2
grid_x, grid_y = np.mgrid[0:1:100j, 0:1:200j]
points = np.random.rand(1000, 2)
values = func(points[:,0], points[:,1])
for t in xrange(10000):
    griddata(points, values, (grid_x, grid_y), method='nearest')
    griddata(points, values, (grid_x, grid_y), method='linear')
    griddata(points, values, (grid_x, grid_y), method='cubic')

随着循环的增加,Python将消耗更多的内存。

loop      memory
1        48.4 MB
10       52.7 MB
100      94.6 MB
1000    500.9 MB

我不确定这是否是gridata的预期行为,也不确定这在过去版本的SciPy中不会发生。根据这个问题,有一个与Cython相关的内存泄漏(我使用的是0.19.1版本),但它应该在SciPy 0.12.0的最终版本中得到解决。

我很感激关于如何解决或解决这个问题的任何建议,或者如果我做错了什么,也很感激任何建议。如果你需要更多信息,请告诉我。

如果仍然很重要的话,问题是scipy 0.12.0和0.12.1可能是在没有对相关文件进行cython重新编译的情况下发布的。

所以以下对我有效:

首先将cython更新到最新的0.19.2版本,然后从源代码重新编译scipy(但源代码来自github,而不是.tar.gz):

git clone https://github.com/scipy/scipy.git
cd scipy
git checkout maintenance/0.12.x
python setup.py build
cd ..
pip install -U ./scipy

然后,帖子中的例子就不会泄露。

更新:事实上,我已经意识到错误地执行了/0.13.x分支——/0.12.x仍然显示内存泄漏。。。

最新更新