Home
Reading
Searching
Subscribe
Sponsors
Statistics
Posting
Contact
Spam
Lists
Links
About
Hosting
Filtering
Features Download
Marketing
Archives
FAQ
Blog
 
Gmane
From: John Hunter <jdhunter-e7tQtC6PTYS3j4TM+ZUt8PZ8FUJU4vz8 <at> public.gmane.org>
Subject: Re: Memory leak with pcolor
Newsgroups: gmane.comp.python.matplotlib.general
Date: Wednesday 2nd November 2005 03:41:35 UTC (over 11 years ago)
>>>>> "Alexander" == Alexander Mont
 writes:

    Alexander> Thanks for your advice with installing matplotlib on
    Alexander> cygwin. I downloaded and installed the windows binaries
    Alexander> and it worked.  Anyway, the reason that I didn't want
    Alexander> to use binaries in the first place was because I wanted
    Alexander> to modify the matplotilb source code. But it seems like
    Alexander> even with the binaries, if I change the source code
    Alexander> then it will still affect the operation of the program
    Alexander> when I run it, which is what I want.

    Alexander> In particular, I am looking to speed up the pcolor()
    Alexander> function because it runs exceedingly slow with large
    Alexander> mesh sizes. I believe the reason it is running slow is
    Alexander> because of a memory leak. When I do the following:

    Alexander> from pylab import * n=200
    Alexander> [x,y]=meshgrid(arange(n+1)*1./n,arange(n+1)*1./n)
    Alexander> z=sin(x**2 + y**2)

    Alexander> and then do

    Alexander> pcolor(x,y,z)

    Alexander> repeatedly, the memory usage increases by about 15 MB
    Alexander> each time, and it runs progressively slower.each

At least with matplotlib CVS (and I don't think it's a CVS vs 0.84
issue) the memory consumption is rock solid with your example (see
below for my test script).  What is your default "hold" setting in rc?
If True, you will be overlaying plots and will get the behavior you
describe.  In the example below, I make sure to "close" the figure
each time -- a plain clear with clf should suffice though.  My guess
is that you are repeatedly calling pcolor with hold : True and are
simply overlaying umpteen pcolors (to test for this, print the length
of the collections list

  ax = gca()
  print len(ax.collections)

if this length is growing, you've found your problem.  A simple

  pcolor(x,y,z,hold=False)

should suffice.

You can also change the default hold setting in your config file
http://matplotlib.sf.net/matplotlibrc

JDH



Example code:

#!/usr/bin/env python

import os, sys, time
import matplotlib
#matplotlib.interactive(True)
#matplotlib.use('Cairo')
matplotlib.use('Agg')
from pylab import *


def report_memory(i):
    pid = os.getpid()
    a2 = os.popen('ps -p %d -o rss,sz' % pid).readlines()
    print i, '  ', a2[1],
    return int(a2[1].split()[1])



# take a memory snapshot on indStart and compare it with indEnd

indStart, indEnd = 30, 201
for i in range(indEnd):

    figure(1); clf()

    n=200
    [x,y]=meshgrid(arange(n+1)*1./n,arange(n+1)*1./n)
    z=sin(x**2 + y**2)
    pcolor(x,y,z)
    savefig('tmp%d' % i, dpi = 75)
    close(1)

    val = report_memory(i)
    if i==indStart: start = val # wait a few cycles for memory usage to
stabilize

end = val
print 'Average memory consumed per loop: %1.4fk bytes\n' %
((end-start)/float(indEnd-indStart))

"""
Average memory consumed per loop: 0.0053k bytes
"""


-------------------------------------------------------
SF.Net email is sponsored by:
Tame your development challenges with Apache's Geronimo App Server.
Download
it for free - -and be entered to win a 42" plasma tv or your very own
Sony(tm)PSP.  Click here to play: http://sourceforge.net/geronimo.php
 
CD: 3ms