2013-07-03 2 views
2

Я использую scipy.interpolate.griddata в цикле, и это заставляет Python накапливать память с каждым циклом. Это использует Python 2.7.5 и SciPy 0.12.0 (установленный через Macports) в Mac OS X 10.6.8.Утечка памяти в SciPy griddata (версия 0.12.0)

Этот код, приведенный ниже, приведен в справочном руководстве 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. Согласно this question, происходит утечка памяти, связанная с Cython (я использую версию 0.19.1), но она должна была быть решена в финальной версии SciPy 0.12.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 вместо этого - the_0.12.x все еще показывает утечку памяти ...

Смежные вопросы