[SciPy-user] How to free memory allocated to array in weave.inline?

Angus McMorland amcmorl@gmail....
Sat Aug 25 18:25:37 CDT 2007

On 25/08/07, Gael Varoquaux <gael.varoquaux@normalesup.org> wrote:
> On Sat, Aug 25, 2007 at 11:37:46PM +1200, Angus McMorland wrote:
> > The code generates a 3-D array, and loops through the array assigning
> > values based on the co-ordinate position. In the final program this
> > array generation has to be done many (ideally 1000s) of times, but
> > when I try this my memory consumption increases.
> My rule of thumb when I create arrays in C code, is not to create arrays
> in C code. Your problem is most probably that your memory does not get
> freed, as it it not registered in Python's garbage collector. You could
> learn how to do this (I don't know how). The other option is to use
> numpy.empty to create an empty array, and pass it to your code that will
> populate it. That way you don't have to deal with all this. It alos makes
> your cod emore readable: no PyArrayObject* and co. in it.

Thanks Gaël, that sounds like a very sensible suggestion, but I'm
having trouble getting it to work. The following causes a segfault. Am
I doing something stupid?

If I understand the manual correctly, the weave code should alter the
array in-place, so I don't need to use return_val for that one. Is
that correct?

def build():
    xsz, ysz, zsz = (200,200,200)
    ar = n.empty((xsz, ysz, zsz), dtype=n.uint8)
    code = '''
    int i,j,k;
    npy_ubyte *curpos;
    for (i = 0; i<xsz; i++)
        for (j = 0; j<ysz; j++)
            for (k = 0; k<zsz; k++)
                curpos = (npy_ubyte *)PyArray_GETPTR3(ar, i, j, k);
                *curpos = 3;
    weave.inline( code, ['ar', 'xsz', 'ysz', 'zsz'] )
    return ar

(As you can probably tell from my other post, ideally I want to use a
boolean array, but that doesn't seem to be supported currently.)

Thanks again,

AJC McMorland, PhD Student
Physiology, University of Auckland

More information about the SciPy-user mailing list