[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