我在循环中使用scipy.interpolate.griddata,它导致Python在每个循环中累积内存。这是在Mac OS X 10.6.8上使用Python 2.7.5和SciPy 0.12.0(通过Macports安装)。
以下代码改编自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
我不确定这是否是griddata的预期行为,我也不确定在过去的SciPy版本中是否会发生这种情况。根据{{3}},存在与Cython相关的内存泄漏(我使用的是版本0.19.1),但它应该在SciPy 0.12.0的最终版本中得到解决。
我感谢任何有关如何解决或解决此问题的建议,或者如果我做错了什么建议。如果您需要更多信息,请与我们联系。
答案 0 :(得分:2)
如果仍然很重要,问题是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仍然显示内存泄漏......