I am about to update the memory leak question in the FAQ, but I thought I'd run it by the list first. I removed language that talked about much earlier releases of mpl, and the paragraph about leaks in older versions of Numeric and numarray. It seems like we should recommend numpy when the user experiences problems with Numeric or numarray, but I wanted to confirm that before adding a paragraph to that effect.

The second question (below), can be ommitted -- it really belongs in a developer's FAQ. Any recommendations on a better place to post that information?

<snip>


     matplotlib appears to be leaking memory, what should I do?

First, determine if it is a true memory leak. Python allocates memory in pools, rather than one object at a time, which can make memory leaks difficult to diagnose. Memory usage may appear to increase rapidly with each iteration, but should eventually reach a steady state if no true memory leaks exist. (For more fine-grained memory usage reporting, you can build a custom Python with the --without-pymalloc flag, which disables pool allocation.) If after sufficient iterations, you still see that memory usage is increasing, it is a likely a bonafide memory leak that should be reported.

memleak_gui.py <http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/matplotlib/unit/memleak_gui.py?view=markup> (in the unit directory of the source tree), contains an example script useful for diagnosing and reporting memory leaks. Please use something like it when reporting leaks so we get an idea of the magnitude of the problem (i.e. bytes per figure). Also please provide your platform, matplotlib version, backend and as much information about the versions of the libraries you are using: freetype, png and zlib. It would also help if you posted code so I could look for any obvious coding errors vis-a-vis matplotlib.

There are some known memory leaks in matplotlib-0.90.1 when used in conjunction with the Tk, Gtk, Wx, Qt and Qt4 GUI backends. Many of these leaks have resolutions in the current SVN version of matplotlib. However, the following library versions are known to have leaks that matplotlib triggers. If you have one of these versions and are experiencing memory leaks, you should upgrade your library. This is not an exhaustive list.

   * *Wx backend:*wxPython-2.8.2 or earlier in the 2.8 series
   * *Gtk backend:*pygobject-2.12.x, pygtk-2.4.0


     I'd like to help diagnose a memory leak, rather than just report
     it. How do you recommend I do that?

I thought you'd never ask! Python memory leaks tend to fall into one of the following categories:

   * *Uncollectable garbage:* The Python garbage collector is not
     infallible. It can not collect objects that the Python that have
     __del__ methods or weakrefs and contain cycles. If curious, you
     can read about this problem in horrific detail
     
<http://svn.python.org/view/python/trunk/Modules/gc_weakref.txt?view=markup>.
     You can obtain a list of all uncollectable objects as follows:

                     import gc
                     print gc.garbage
     To see what cycles these objects participate in, there is a useful
     function in matplotlib.cbook:

                     from matplotlib import cbook
                cbook.print_cycles(gc.garbage)
     This will print out all of the reference cycles that are
     preventing the uncollectable objects from being freed. The code
     should then be modified to prevent these cycles, or break the
     cycles during destruction.
   * *Real references:* Sometimes objects are legitimately being held
     onto by other Python objects. When this happens, you would see the
     total number of Python objects in the interpreter increase with
     each iteration of your test, even when you didn't intend any data
     to "stick around". You can print out the total number of objects
     in the interpreter:

                     import gc
                print len(gc.get_objects())
     By comparing the objects before and after your test, you can
     determine which of them remain between iterations:

                     original_objects = [id(x) for x in gc.get_objects()]
                # ... do something that leaks objects
new_objects = [x for x in gc.get_objects() if id(x) not in original_objects]
     You can then determine what is referencing those objects and
     causing them to stick around:

                     print gc.get_referents(x)
     The code should be modified to prevent these unwanted references.
   * *C/C++ leaks in extension objects:* These is the classic problem
     of objects that are "malloc'd/new'd" and never "freed/deleted" in
     C or C++ parlance. There are many memory debuggers available such
     as Purify or Valgrind to help find these errors. I recommend
     reading the documentation about using these tools in conjunction
     with Python
     <http://svn.python.org/view/python/trunk/Misc/README.valgrind?view=markup>
     to avoid a lot of false positives.

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Matplotlib-devel mailing list
Matplotlib-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-devel

Reply via email to