2

我在循环中使用 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 中不会发生。根据这个问题,有一个与 Cython 相关的内存泄漏(我使用的是 0.19.1 版),但它应该在 SciPy 0.12.0 的最终版本中得到解决。

我感谢有关如何解决或解决此问题的任何建议,或者如果我做错了任何建议。如果您需要更多信息,请与我们联系。

4

1 回答 1

2

如果仍然很重要,问题是 scipy 0.12.0 和 0.12.1 可能已经发布,而没有对相关文件进行 cython 重新编译。

所以以下对我有用:

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

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 仍然显示内存泄漏......

于 2013-10-14T14:48:28.300 回答