[Numpy-discussion] Solving a memory leak in a numpy extension; PyArray_ContiguousFromObject
Charles R Harris
charlesr.harris at gmail.com
Fri Apr 17 21:47:47 EDT 2009
On Fri, Apr 17, 2009 at 9:25 AM, Dan S
<dan.s.towell+numpy at gmail.com<dan.s.towell%2Bnumpy at gmail.com>
> wrote:
> Hi -
>
> I have written a numpy extension which works fine but has a memory
> leak. It takes a single array argument and returns a single scalar.
> After reducing the code down in order to chase the problem, I have the
> following:
>
> static PyObject * kdpee_pycall(PyObject *self, PyObject *args)
> {
> PyObject *input;
> PyArrayObject *array;
> int n, numdims;
>
> if (!PyArg_ParseTuple(args, "O", &input))
> return NULL;
>
> // Ensure we have contiguous, 2D, floating-point data:
> array = (PyArrayObject*) PyArray_ContiguousFromObject(input,
> PyArray_DOUBLE, 2, 2);
>
> if(array==NULL){
> printf("kdpee_py: nullness!\n");
> return NULL;
> }
> PyArray_XDECREF(array);
> Py_DECREF(array); // destroy the contig array
> Py_DECREF(input); // is this needed? doc says no, but it seems to
> fix
> a reference-count-leak
> return PyFloat_FromDouble(3.1415927); // temporary
> }
>
>
> The test code is
>
> from numpy import *
> from kdpee import *
> import sys
> a = array( [[1,2,3,4,5,1,2,3,4,5], [6,7,8,9,0,6,7,8,9,0]])
> sys.getrefcount(a)
> for i in range(5000): tmp = kdpee(a)
>
> sys.getrefcount(a)
>
> Every time I run this code I get "2" back from both calls to
> sys.getrefcount(a), but I'm still getting a memory leak of about 0.4
> MB. What am I doing wrong?
>
So about 80 bytes/iteration? How accurate is that .4 MB? does it change with
the size of the input array?
Chuck
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20090417/de80469e/attachment.html>
More information about the NumPy-Discussion
mailing list