[SciPy-user] Memory leak in delaunay interpolator

Michael.Abshoff michael.abshoff at googlemail.com
Thu Jan 17 00:06:42 EST 2008


Pauli Virtanen wrote:
> Wed, 16 Jan 2008 20:40:33 +0100, Nils Wagner wrote:
> 
>> On Wed, 16 Jan 2008 11:38:02 +0100
>>   Rob Hetland <hetland at tamu.edu> wrote:
>>> I'm not sure who else uses the delaunay package (was in
>>>
>>> scipy.sandbox, now lives in scikits), but I find it
>>> indispensable. Today I found what appears to be a memory leak in the
>>> interpolator and extrapolator objects.  This simple code demonstrates
>>> the leak:
> 
> This may be the same as bug #382 (patch is available in the ticket).
> 
> Also #376 may be relevant for the observed segfault: there are
> (or were?) known crasher bugs in the delaunay module.
> 

Hi,

I ran the following code in Sage under valgrind's memcheck [slightly 
adapted from the previous post]:

sage: from delaunay import *
sage: from numpy.random import rand
sage: xi, yi = rand(2, 1000)
sage: tri=Triangulation(xi, yi)
sage: for n in range(100000):
....:         interp = tri.nn_interpolator(rand(1000))
....:     z = interp(x, y)

using today's scipy sandbox checkout. The following popped up:

==16816== 6,944 bytes in 1 blocks are definitely lost in loss record 
7,840 of 8,087
==16816==    at 0x4A1BB35: malloc (vg_replace_malloc.c:207)
==16816==    by 0x1BFE7829: VoronoiDiagramGenerator::myalloc(unsigned) 
(VoronoiDiagramGenerator.cpp:725)
==16816==    by 0x1BFE788D: VoronoiDiagramGenerator::PQinitialize() 
(VoronoiDiagramGenerator.cpp:570)
==16816==    by 0x1BFE8305: VoronoiDiagramGenerator::voronoi(int) 
(VoronoiDiagramGenerator.cpp:924)
==16816==    by 0x1BFE89DA: 
VoronoiDiagramGenerator::generateVoronoi(double*, double*, int, double, 
double, double, double,
double) (VoronoiDiagramGenerator.cpp:136)
==16816==    by 0x1BFE65D7: delaunay_method (_delaunay.cpp:125)
==16816==    by 0x4833C1: PyEval_EvalFrameEx (ceval.c:3564)
==16816==    by 0x4852CA: PyEval_EvalCodeEx (ceval.c:2831)
==16816==    by 0x4CE817: function_call (funcobject.c:517)
==16816==    by 0x415542: PyObject_Call (abstract.c:1860)
==16816==    by 0x41BC62: instancemethod_call (classobject.c:2497)
==16816==    by 0x415542: PyObject_Call (abstract.c:1860)

I am not sure if the patch from #382 has been applied to svn trunk, I am 
still finding my way around scipy.

The other oddity that popped up was:

==16816==    at 0x15A89C1D: PyArray_MapIterReset (arrayobject.c:9854)
==16816==    by 0x15AC4827: array_subscript (arrayobject.c:2403)
==16816==    by 0x15AC4B54: array_subscript_nice (arrayobject.c:3030)
==16816==    by 0x47FA38: PyEval_EvalFrameEx (ceval.c:1192)
==16816==    by 0x4843CA: PyEval_EvalFrameEx (ceval.c:3650)
==16816==    by 0x4852CA: PyEval_EvalCodeEx (ceval.c:2831)
==16816==    by 0x4CE817: function_call (funcobject.c:517)
==16816==    by 0x415542: PyObject_Call (abstract.c:1860)
==16816==    by 0x41BC62: instancemethod_call (classobject.c:2497)
==16816==    by 0x415542: PyObject_Call (abstract.c:1860)
==16816==    by 0x455F97: slot_tp_init (typeobject.c:4862)
==16816==    by 0x458E40: type_call (typeobject.c:436)

If you are interested [and aren't already doing it] I could run valgrind 
on the whole numpy/scipy test suite on a regular basis. I already do 
that on a weekly basis for the Sage doctests, so adding it wouldn't be 
too much work once I have the build and testing automated.

Cheers,

Michael



More information about the SciPy-User mailing list