From: John H. <jdh...@ac...> - 2005-11-02 03:45:52
|
>>>>> "Alexander" == Alexander Mont <ale...@co...> 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 """ |