From: Steve C. <ste...@ya...> - 2004-06-08 09:53:44
|
There does seem to be a memory problem when using Python and GTK+. Have you seen the pygtk FAQ 8.4 "Is there a resource leak? Why do I run out of memory using Pixbuf?" >From looking at matplotlib/backends/backend_gtk.py I noticed every FigureCanvasGTK.draw() operation allocates memory for a new pixmap and a new graphics context. So looping 200 times in your first test script allocates memory for 200 pixmaps and 200 graphics contexts, yet the pixmap size has not changed and the graphics context has not changed. I think it would be more memory efficient to create a pixmap and continue using it until a larger pixmap is required. The graphics context does not change its default settings, so it does little, but is required for the GDK calls, again it looks to me like it would be better to create one and reuse it. Here are some changes I made to matplotlib/backends/backend_gtk.py I estimate saves around 10% of the memory leak. However I can't check that it plots correctly properly because I currently get a plot of a black rectangle in GTK mode (GTKAgg works OK), which I think was mentioned as a numarray problem with the latest matplotlib release. FigureCanvasGTK.__init__(self,figure): # add the following line self.pixmap_width, self.pixmap_height = -1, -1 # new FigureCanvasGTK.draw(self): # replace with this: def draw(self): if not self._doplot: return drawable = self.window if drawable is None: return width = int(self.figure.bbox.width()) height = int(self.figure.bbox.height()) if width > self.pixmap_width or height > self.pixmap_height: self._gpixmap = gtk.gdk.Pixmap(drawable, width, height) self.pixmap_width = width self.pixmap_height = height self.figure.draw( RendererGTK(self, self._gpixmap, self.figure.dpi) ) drawable.draw_drawable(self._ggc, self._gpixmap, 0, 0, 0, 0, width, height) FigureCanvasGTK.realize(self, widget): # add the following line: self._ggc = self.window.new_gc() Regards Steve |