|
From: Mátyás J. <mj...@gm...> - 2008-10-01 22:49:00
|
Hi,
I'm looking for memory leaks in a python application and found leaks in
matplotlib. The application is graphic intensive. Each time it updates
the screen, matplotlib allocates another 5-10 megabytes memory for the
new gtk.gdk.Pixbuf and gtk.gdk.GCX11 while does not free up the buffers
allocated for the previous content.
I switched on garbage collection debugging with:
import gc
gc.enable()
gc.set_debug(gc.DEBUG_LEAK)
and tried to delete the leaking objects:
--- ./lib/matplotlib/backends/backend_gtkagg.py 2008-06-23
04:09:29.000000000 +0200 ++
+ /usr/lib/python2.4/site-packages/matplotlib-0.91.4-py2.4-linux-i686.egg/matplotlib/backends/backend_gtkagg.py
2008-10-02 00:05:32.000000000 +0200 @@ -3,6 +3,7 @@ """
from __future__ import division
import os
+import gc
import matplotlib
from matplotlib.figure import Figure
@@ -82,8 +83,17 @@
h = int(ren.height)
pixbuf = gtk.gdk.pixbuf_new_from_data(
buf, gtk.gdk.COLORSPACE_RGB, True, 8, w, h, w*4)
- pixmap.draw_pixbuf(pixmap.new_gc(), pixbuf, 0, 0, 0, 0, w, h,
+ g = pixmap.new_gc()
+ pixmap.draw_pixbuf(g, pixbuf, 0, 0, 0, 0, w, h,
gtk.gdk.RGB_DITHER_NONE, 0, 0)
+
+ print "XXXXXXXXXX", pixbuf,
g,pixbuf.__grefcount__,g.__grefcount__
+ print gc.get_referrers(pixbuf)
+ print gc.get_referrers(g)
+ del pixbuf
+ del g
+ gc.collect()
+
if DEBUG: print 'FigureCanvasGTKAgg.render_figure done'
def blit(self, bbox=None):
The __grefcount__ values are 1 but the memory is not freed up even after
gc.collect().
|
|
From: Eric F. <ef...@ha...> - 2008-10-01 23:45:18
|
Mátyás János wrote: > Hi, > > I'm looking for memory leaks in a python application and found leaks in > matplotlib. The application is graphic intensive. Each time it updates > the screen, matplotlib allocates another 5-10 megabytes memory for the > new gtk.gdk.Pixbuf and gtk.gdk.GCX11 while does not free up the buffers > allocated for the previous content. > This sounds to me like a pygtk bug, not a matplotlib bug; a gtk object is hanging around after its reference has been deleted. What versions of gtk and pygtk are you using? This sounds dimly familiar. I don't know enough about gtk and pygtk to help, but I am sure the people who do know more will want to know the version. Eric > I switched on garbage collection debugging with: > > import gc > gc.enable() > gc.set_debug(gc.DEBUG_LEAK) > > and tried to delete the leaking objects: > > --- ./lib/matplotlib/backends/backend_gtkagg.py 2008-06-23 > 04:09:29.000000000 +0200 ++ > + /usr/lib/python2.4/site-packages/matplotlib-0.91.4-py2.4-linux-i686.egg/matplotlib/backends/backend_gtkagg.py > 2008-10-02 00:05:32.000000000 +0200 @@ -3,6 +3,7 @@ """ > from __future__ import division > import os > +import gc > > import matplotlib > from matplotlib.figure import Figure > @@ -82,8 +83,17 @@ > h = int(ren.height) > pixbuf = gtk.gdk.pixbuf_new_from_data( > buf, gtk.gdk.COLORSPACE_RGB, True, 8, w, h, w*4) > - pixmap.draw_pixbuf(pixmap.new_gc(), pixbuf, 0, 0, 0, 0, w, h, > + g = pixmap.new_gc() > + pixmap.draw_pixbuf(g, pixbuf, 0, 0, 0, 0, w, h, > gtk.gdk.RGB_DITHER_NONE, 0, 0) > + > + print "XXXXXXXXXX", pixbuf, > g,pixbuf.__grefcount__,g.__grefcount__ > + print gc.get_referrers(pixbuf) > + print gc.get_referrers(g) > + del pixbuf > + del g > + gc.collect() > + > if DEBUG: print 'FigureCanvasGTKAgg.render_figure done' > > def blit(self, bbox=None): > > > The __grefcount__ values are 1 but the memory is not freed up even after > gc.collect(). > > ------------------------------------------------------------------------- > This SF.Net email is sponsored by the Moblin Your Move Developer's challenge > Build the coolest Linux based applications with Moblin SDK & win great prizes > Grand prize is a trip for two to an Open Source event anywhere in the world > http://moblin-contest.org/redirect.php?banner_id=100&url=/ > _______________________________________________ > Matplotlib-devel mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-devel |
|
From: Michael D. <md...@st...> - 2008-10-02 12:26:17
|
Agreed. I'm not sure how this bug could be resolved only on the matplotlib side. See if you can make a standalone (pygtk-only) example that demonstrates this bug and send it to their mailing list. Also, if it's possible, try updating pygtk. There was a very similar bug in an earlier version (sorry, I can't find the reference), that was resolved. Cheers, Mike Eric Firing wrote: > Mátyás János wrote: > >> Hi, >> >> I'm looking for memory leaks in a python application and found leaks in >> matplotlib. The application is graphic intensive. Each time it updates >> the screen, matplotlib allocates another 5-10 megabytes memory for the >> new gtk.gdk.Pixbuf and gtk.gdk.GCX11 while does not free up the buffers >> allocated for the previous content. >> >> > > This sounds to me like a pygtk bug, not a matplotlib bug; a gtk object > is hanging around after its reference has been deleted. What versions of > gtk and pygtk are you using? This sounds dimly familiar. I don't know > enough about gtk and pygtk to help, but I am sure the people who do know > more will want to know the version. > > Eric > > >> I switched on garbage collection debugging with: >> >> import gc >> gc.enable() >> gc.set_debug(gc.DEBUG_LEAK) >> >> and tried to delete the leaking objects: >> >> --- ./lib/matplotlib/backends/backend_gtkagg.py 2008-06-23 >> 04:09:29.000000000 +0200 ++ >> + /usr/lib/python2.4/site-packages/matplotlib-0.91.4-py2.4-linux-i686.egg/matplotlib/backends/backend_gtkagg.py >> 2008-10-02 00:05:32.000000000 +0200 @@ -3,6 +3,7 @@ """ >> from __future__ import division >> import os >> +import gc >> >> import matplotlib >> from matplotlib.figure import Figure >> @@ -82,8 +83,17 @@ >> h = int(ren.height) >> pixbuf = gtk.gdk.pixbuf_new_from_data( >> buf, gtk.gdk.COLORSPACE_RGB, True, 8, w, h, w*4) >> - pixmap.draw_pixbuf(pixmap.new_gc(), pixbuf, 0, 0, 0, 0, w, h, >> + g = pixmap.new_gc() >> + pixmap.draw_pixbuf(g, pixbuf, 0, 0, 0, 0, w, h, >> gtk.gdk.RGB_DITHER_NONE, 0, 0) >> + >> + print "XXXXXXXXXX", pixbuf, >> g,pixbuf.__grefcount__,g.__grefcount__ >> + print gc.get_referrers(pixbuf) >> + print gc.get_referrers(g) >> + del pixbuf >> + del g >> + gc.collect() >> + >> if DEBUG: print 'FigureCanvasGTKAgg.render_figure done' >> >> def blit(self, bbox=None): >> >> >> The __grefcount__ values are 1 but the memory is not freed up even after >> gc.collect(). >> >> ------------------------------------------------------------------------- >> This SF.Net email is sponsored by the Moblin Your Move Developer's challenge >> Build the coolest Linux based applications with Moblin SDK & win great prizes >> Grand prize is a trip for two to an Open Source event anywhere in the world >> http://moblin-contest.org/redirect.php?banner_id=100&url=/ >> _______________________________________________ >> Matplotlib-devel mailing list >> Mat...@li... >> https://lists.sourceforge.net/lists/listinfo/matplotlib-devel >> > > > > ------------------------------------------------------------------------- > This SF.Net email is sponsored by the Moblin Your Move Developer's challenge > Build the coolest Linux based applications with Moblin SDK & win great prizes > Grand prize is a trip for two to an Open Source event anywhere in the world > http://moblin-contest.org/redirect.php?banner_id=100&url=/ > _______________________________________________ > Matplotlib-devel mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-devel > -- Michael Droettboom Science Software Branch Operations and Engineering Division Space Telescope Science Institute Operated by AURA for NASA |
|
From: Mátyás J. <mj...@gm...> - 2008-10-02 19:58:46
|
Hi, thank you very much! The memory leak disappeared after I updated pygobject from 2.12 to 2.13.2. |