sorry, i replied to Mike and not to the list. see below.

On Thu, Jul 2, 2009 at 2:57 PM, Ralf Gommers <ralf.gomm...@googlemail.com>wrote:

> Thanks for looking into this Mike.
>
> On Thu, Jul 2, 2009 at 10:39 AM, Michael Droettboom <md...@stsci.edu>wrote:
>
>> It is not surprising that memory usage is much lower without printing the
>> plot.  Very little is actually done by the "plot" command other than setting
>> up a tree of objects that is later rendered during the printing process
>> (where most of the work happens).
>>
>> The attached script based on what you provided doesn't leak memory for me
>> with matplotlib 0.98.5.2.  It would appear that there is something else in
>> your application triggering the leak.  Perhaps there is something holding a
>> reference longer than it should?
>>
>
> Your attached script memleak2.py is indeed fine, it never takes up more
> than 60Mb of RAM. But did you try to run the PyQt4  GUI I attached? There
> the same save_png() function does increase memory usage for each call.
>
> I'm not sure how to exactly measure memory usage for a GUI program, but it
> is so large I can look at "System Activity" (or Task Manager on XP) and get
> the approximate number:
>
> Loading the GUI: 30.5Mb
> 1st call to save_png: 82Mb
> 2nd call: 116Mb
> 10th call: 380Mb
>
> I can see the memory usage drop after some calls, so I guess it is a
> problem of references being held and sometimes being released as you said.
> But memory use does seem to be unbounded. Waiting for minutes, or
> interacting with the GUI, never releases any memory. It is strange, the
> PyQt4 demo program is fine by itself, save_png() is fine by itself, but
> combine them and there's a memory problem.
>
> Cheers,
> Ralf
>
>
>
>> You can see from the attached massif plots that memory usage never becomes
>> unbounded.  It is normal for Python to delay deallocation for efficiency
>> reasons.  Calling gc.collect (the second graph) does help keep memory usage
>> more compact however, if that is a primary concern.
>>
>> Cheers,
>> Mike
>>
>> Ralf Gommers wrote:
>>
>>> Hi,
>>>
>>> I am working on a PyQt4 application with some embedded MPL figures, and
>>> am also trying to save some figures as png's without displaying them. I am
>>> observing huge memory increases (10s or 100s of Mb) the moment I try to save
>>> a png. I reproduced the issue by combining two mpl examples,
>>> http://matplotlib.sourceforge.net/examples/user_interfaces/embedding_in_qt4.htmland
>>> http://matplotlib.sourceforge.net/examples/api/agg_oo.html. Full code is
>>> attached. When pressing the "save figure" button, memory usage shoots up,
>>> multiple clicks keep sending it higher (although not monotonically).
>>>
>>> I tested on two different platforms
>>> - Matplotlib 98.5.2 and Python 2.6.2 on Ubuntu.
>>> - latest Enthought Python Distribution on Windows XP.
>>>
>>> The function that does the png saving is:
>>>
>>> def save_png():
>>>    """Save an image as a png file"""
>>>
>>>    pngpath = 'test_mplsave.png'
>>>
>>>    fig = Figure()
>>>    canvas = FigureCanvas(fig)
>>>    ax = fig.add_subplot(111)
>>>    x = arange(5e3)
>>>    ax.plot(x, sin(x))
>>>    canvas.print_figure(pngpath)
>>>
>>>    ## tried all things commented out below, all makes no difference ##
>>>    #fig.savefig(pngpath)
>>>
>>>    #del(fig)
>>>    #del(canvas)
>>>    #del(ax)
>>>
>>>    #import matplotlib.pyplot as plt
>>>    #plt.close(fig)
>>>
>>>    #import gc
>>>    #gc.collect()
>>>
>>> Commenting out the canvas.print_figure line fixes the issue.
>>>
>>> Am I doing something obviously wrong, or mixing two incompatible ways of
>>> doing things?
>>>
>>> Cheers,
>>> Ralf
>>>
>>> ------------------------------------------------------------------------
>>>
>>>
>>> ------------------------------------------------------------------------------
>>> ------------------------------------------------------------------------
>>>
>>> _______________________________________________
>>> Matplotlib-users mailing list
>>> Matplotlib-users@lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>>>
>>
>> --
>> Michael Droettboom
>> Science Software Branch
>> Operations and Engineering Division
>> Space Telescope Science Institute
>> Operated by AURA for NASA
>>
>>
>> from matplotlib.backends.backend_agg import FigureCanvasAgg as
>> FigureCanvas
>> from matplotlib.figure import Figure
>>
>> from numpy import arange, sin
>>
>> import gc
>>
>> def save_png():
>>    """Save an image as a png file"""
>>
>>    pngpath = 'test_mplsave.png'
>>
>>    fig = Figure()
>>    canvas = FigureCanvas(fig)
>>    ax = fig.add_subplot(111)
>>    x = arange(5e3)
>>    ax.plot(x, sin(x))
>>    canvas.print_figure(pngpath)
>>
>>    # The below is not necessary to prevent a leak, but it does make
>>    # memory usage more compact
>>    gc.collect()
>>
>> for i in range(100):
>>    save_png()
>>
>>
>>
>>
>
------------------------------------------------------------------------------
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to