Я написал расширение C для NumPy, чтобы ускорить некоторые из моих вычислений, но я все больше использую память, когда вызываю функцию несколько раз.Я урезал функцию до минимального примера:
PyObject* memory_test_function(PyObject* self, PyObject* args)
{
PyArrayObject *ang;
int i;
if (!PyArg_ParseTuple(args, "O", &ang)) return NULL;
int L0 = (int) PyArray_DIMS(ang)[0];
// ballooning memory usage
npy_intp final_out_dims[2] = {L0,1};
PyObject *output_array;
output_array = PyArray_SimpleNew(2, final_out_dims, NPY_FLOAT64);
Py_INCREF(output_array);
for (i=0;i<L0;i++)
{
*(double *)PyArray_GETPTR2(output_array,i,0) =
tan(*(double *)PyArray_GETPTR2(ang,i,0));
}
return PyArray_Return(output_array);
/* constant memory usage
double sum=0.0;
for (i=0;i<L0;i++) sum+=tan(*(double *)PyArray_GETPTR2(ang,i,0));
return PyFloat_FromDouble(sum); */
}
Проблема, по-видимому, вызвана созданием выходного массива, поскольку просто возвращение числа с плавающей запятой без создания объекта массива является постоянным в памяти.Я подозреваю, что есть проблема с INCREF / DECREF, но я думал, что все делал правильно.Повторный вызов этой функции (миллион или около того раз) приводит к линейному увеличению использования памяти со временем, что заставляет меня думать, что что-то неправильно собирается.Использование gc
вручную не помогает.Пожалуйста, дайте мне знать, если есть что-то очевидное, что мне не хватает!