Re: Memory leak when pos is changed

Bruce Sherwood <[email protected]>
Newsgroups gmane.comp.python.visualpython.user
Message-ID <CAFDG03gUzoZRxpDRdAxeRo-igH-S2KTRsyEja_DxjQEfGtp2mw@mail.gmail.com>
The discussion you found about a memory leak referred to a bug that
was fixed last March. From the "recent developments" section of
vpython.org: 2011-03-01 Visual 5.51: Fix memory leak on Windows and
Mac.

You've found a different memory leak, one that has not previously been
reported. The leak that was fixed was a bug in rendering the scene on
Windows and Mac, with the effect that setting object.visible = False
eliminated the leak. Setting object.visible = False in your program
doesn't make any difference: the leak is still there.

Thanks much for reporting this. At the moment I don't know what is
causing the leak. I note that commenting out make_normals, smooth, and
make_twosided has no effect on the leak. The leak is associated with
self.model.pos = self.vertices (but, I repeat, independent of whether
the faces object is visible or not). I also note that if one executes
m.Draw just once (putting a break at the end of the while loop), there
is no leak, confirming that the leak is not associated with the
repeated rendering that is automatically performed, unlike the case
with the old leak.

Since the problem is somehow associated with the statement
self.model.pos = self.vertices, I made a version of your program that
allocates once and for all the pos array, then assigns values to the
pos array rather than constructing a vertices array first. The
following program does not show a memory leak. This of course leaves
open the question of why there is a leak when one assigns an array to
faces.pos.

from visual import *

class Model:
    def __init__(self):
        self.frame = frame()
        self.model = faces(frame=self.frame, color=color.cyan, visible=True)

class Mesh (Model):
    def __init__(self, z):
        Model.__init__(self)
        self.length = (z.shape[0]-1)*(z.shape[1]-1)*6 # length of one-sided data
        self.model.pos = zeros( (2*self.length,3), float ) # space for
two-sided data

    def Update(self, xvalues, yvalues, zvalues):
        points = zeros( xvalues.shape + (3,), float )
        points[...,0] = xvalues
        points[...,1] = yvalues
        points[...,2] = zvalues

        p = 0
        for i in range(zvalues.shape[0]-1):
            for j in range(zvalues.shape[1]-1):
                self.model.pos[p  ] = points[i,j]
                self.model.pos[p+1] = points[i,j+1]
                self.model.pos[p+2] = points[i+1,j+1]
                self.model.pos[p+3] = points[i,j]
                self.model.pos[p+4] = points[i+1,j+1]
                self.model.pos[p+5] = points[i+1,j]
                self.model.pos[self.length+p  ] = points[i,j]
                self.model.pos[self.length+p+2] = points[i,j+1]
                self.model.pos[self.length+p+1] = points[i+1,j+1]
                self.model.pos[self.length+p+3] = points[i,j]
                self.model.pos[self.length+p+5] = points[i+1,j+1]
                self.model.pos[self.length+p+4] = points[i+1,j]
                p += 6
        self.model.make_normals()
        self.model.smooth()

x = arange(-1,1,2./20)
y = arange(-1,1,2./20)

z = zeros( (len(x),len(y)), float )
x,y = x[:,None]+z, y+z

m = Mesh(y)

i = 0
dt = 0.05
while True:
    m.Update( x, (sin(x*pi + i*dt)+sin(y*pi + i*dt))*0.2, y )
    i += 1
    rate(100)

Bruce Sherwood

On Fri, Jul 22, 2011 at 3:15 AM, Wojtek Frycz <[email protected]> wrote:
> Hi!
> I'm new to VPython project but I found a memory leak. There was something
> mentioned about this problem before. I found it here:
> http://sourceforge.net/mailarchive/forum.php?thread_name=AANLkTim8RL8kjW0%3DSK%2B9f-2A5TCQv6wAu9aTpBmisbNS%40mail.gmail.com&forum_name=visualpython-users.
> But unfortunately I didn't find the solution.

------------------------------------------------------------------------------
Storage Efficiency Calculator
This modeling tool is based on patent-pending intellectual property that
has been used successfully in hundreds of IBM storage optimization engage-
ments, worldwide.  Store less, Store more with what you own, Move data to 
the right place. Try It Now! http://www.accelacomm.com/jaw/sfnl/114/51427378/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.