Re: [Matplotlib-users] Qt4/PySide memory leak

2012-10-01 Thread Christoph Gohlke

On 9/24/2012 5:50 PM, Christoph Gohlke wrote:

On 9/24/2012 3:32 PM, David Honcik wrote:

I've run into a large memory leak using Matplotlib with PySide and the
Qt4 back end.  I'm using :
Python 3.2
Numpy 1.6.2
Pyside 1.1.1 (qt474)
Matplotlib 1.2 (first the Capetown Group port to Python 3, then 1.2 RC2)
on Windows XP 32 bit
I've tried using the Python 2.7 branch of all of the above and don't see
the problem.  I don't see the problem with the Tk back end.  I don't see
the problem with the Qt4 back end and PyQt4.  Only with the above
mentioned versions and using the Qt4 back end with PySide.
The following script will reproduce the problem :

import matplotlib
matplotlib.use('Qt4Agg')
matplotlib.rcParams['backend.qt4']='PySide'
import pylab
arrayX = []
arrayY = []
for nIndex in range(0, 100):
arrayX.append(nIndex)
arrayY.append(nIndex)
Figure = matplotlib.pyplot.figure(1)
Axes = Figure.add_axes([ 0.05, 0.05, 0.95, 0.95])
Axes.plot(arrayX,
arrayY,
color  = "blue",
marker = "o",
markersize = 5.0)
Axes.set_xlim(arrayX[0], arrayX[len(arrayX) - 1])
Axes.set_ylim(arrayY[0], arrayY[len(arrayY) - 1])
matplotlib.pyplot.show()

I run the above, grab the lower right sizing handle on the plot window
and start resizing the window.  Watching the python process in task
manager, each resize leaks a noticeable amount of memory.  A few minutes
of this will get process memory up to ~2.5 GB. At that point it crashes.
I'm new here, am I in the right place?



I can reproduce this exactly, also with pyside 1.1.2 and an empty plot.
Looks like QtGui.QImage is leaking.

import matplotlib
matplotlib.use('Qt4Agg')
matplotlib.rcParams['backend.qt4']='PySide'
from matplotlib import pyplot
pyplot.plot()
pyplot.show()

--
Christoph




As a workaround, until PySide is fixed, use the attached patch, which 
forcibly decreases the reference count of the string buffer after use.


Christoph
diff --git a/lib/matplotlib/backends/backend_qt4agg.py 
b/lib/matplotlib/backends/backend_qt4agg.py
index 0701781..408f3ce 100644
--- a/lib/matplotlib/backends/backend_qt4agg.py
+++ b/lib/matplotlib/backends/backend_qt4agg.py
@@ -4,6 +4,7 @@ Render to qt from agg
 from __future__ import division, print_function
 
 import os, sys
+import ctypes
 
 import matplotlib
 from matplotlib.figure import Figure
@@ -15,6 +16,10 @@ from backend_qt4 import QtCore, QtGui, FigureManagerQT, 
FigureCanvasQT,\
 
 DEBUG = False
 
+decref = ctypes.pythonapi.Py_DecRef
+decref.argtypes = [ctypes.py_object]
+decref.restype = None
+
 
 def new_figure_manager( num, *args, **kwargs ):
 """
@@ -95,6 +100,8 @@ class FigureCanvasQTAgg( FigureCanvasQT, FigureCanvasAgg ):
 else:
 stringBuffer = self.renderer._renderer.tostring_argb()
 
+refcnt = sys.getrefcount(stringBuffer)
+
 qImage = QtGui.QImage(stringBuffer, self.renderer.width,
   self.renderer.height,
   QtGui.QImage.Format_ARGB32)
@@ -106,6 +113,11 @@ class FigureCanvasQTAgg( FigureCanvasQT, FigureCanvasAgg ):
 p.setPen( QtGui.QPen( QtCore.Qt.black, 1, QtCore.Qt.DotLine ) )
 p.drawRect( self.rect[0], self.rect[1], self.rect[2], 
self.rect[3] )
 p.end()
+
+del qImage
+if refcnt != sys.getrefcount(stringBuffer):
+# Fix a memory leak in PySide on Python 3
+decref(stringBuffer)
 else:
 bbox = self.blitbox
 l, b, r, t = bbox.extents
--
Don't let slow site performance ruin your business. Deploy New Relic APM
Deploy New Relic app performance management and know exactly
what is happening inside your Ruby, Python, PHP, Java, and .NET app
Try New Relic at no cost today and get our sweet Data Nerd shirt too!
http://p.sf.net/sfu/newrelic-dev2dev___
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users


Re: [Matplotlib-users] Qt4/PySide memory leak

2012-09-24 Thread Christoph Gohlke
On 9/24/2012 3:32 PM, David Honcik wrote:
> I've run into a large memory leak using Matplotlib with PySide and the
> Qt4 back end.  I'm using :
> Python 3.2
> Numpy 1.6.2
> Pyside 1.1.1 (qt474)
> Matplotlib 1.2 (first the Capetown Group port to Python 3, then 1.2 RC2)
> on Windows XP 32 bit
> I've tried using the Python 2.7 branch of all of the above and don't see
> the problem.  I don't see the problem with the Tk back end.  I don't see
> the problem with the Qt4 back end and PyQt4.  Only with the above
> mentioned versions and using the Qt4 back end with PySide.
> The following script will reproduce the problem :
> 
> import matplotlib
> matplotlib.use('Qt4Agg')
> matplotlib.rcParams['backend.qt4']='PySide'
> import pylab
> arrayX = []
> arrayY = []
> for nIndex in range(0, 100):
> arrayX.append(nIndex)
> arrayY.append(nIndex)
> Figure = matplotlib.pyplot.figure(1)
> Axes = Figure.add_axes([ 0.05, 0.05, 0.95, 0.95])
> Axes.plot(arrayX,
> arrayY,
> color  = "blue",
> marker = "o",
>markersize = 5.0)
> Axes.set_xlim(arrayX[0], arrayX[len(arrayX) - 1])
> Axes.set_ylim(arrayY[0], arrayY[len(arrayY) - 1])
> matplotlib.pyplot.show()
> 
> I run the above, grab the lower right sizing handle on the plot window
> and start resizing the window.  Watching the python process in task
> manager, each resize leaks a noticeable amount of memory.  A few minutes
> of this will get process memory up to ~2.5 GB. At that point it crashes.
> I'm new here, am I in the right place?
>

I can reproduce this exactly, also with pyside 1.1.2 and an empty plot. 
Looks like QtGui.QImage is leaking.

import matplotlib
matplotlib.use('Qt4Agg')
matplotlib.rcParams['backend.qt4']='PySide'
from matplotlib import pyplot
pyplot.plot()
pyplot.show()

--
Christoph


--
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
___
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users


[Matplotlib-users] Qt4/PySide memory leak

2012-09-24 Thread David Honcik
I've run into a large memory leak using Matplotlib with PySide and the
Qt4 back end.  I'm using :
 
Python 3.2
Numpy 1.6.2
Pyside 1.1.1 (qt474)
Matplotlib 1.2 (first the Capetown Group port to Python 3, then 1.2 RC2)
 
on Windows XP 32 bit
 
 
I've tried using the Python 2.7 branch of all of the above and don't see
the problem.  I don't see the problem with the Tk back end.  I don't see
the problem with the Qt4 back end and PyQt4.  Only with the above
mentioned versions and using the Qt4 back end with PySide.
 
The following script will reproduce the problem :
 

import matplotlib
 
matplotlib.use('Qt4Agg')
matplotlib.rcParams['backend.qt4']='PySide'

import pylab
 
arrayX = []
arrayY = []
for nIndex in range(0, 100):
arrayX.append(nIndex)
arrayY.append(nIndex)
 
Figure = matplotlib.pyplot.figure(1)
Axes = Figure.add_axes([ 0.05, 0.05, 0.95, 0.95])
 
Axes.plot(arrayX,
  arrayY,
  color  = "blue",
  marker = "o",
  markersize = 5.0)
 
Axes.set_xlim(arrayX[0], arrayX[len(arrayX) - 1])
Axes.set_ylim(arrayY[0], arrayY[len(arrayY) - 1])
 
matplotlib.pyplot.show()


 
I run the above, grab the lower right sizing handle on the plot window
and start resizing the window.  Watching the python process in task
manager, each resize leaks a noticeable amount of memory.  A few minutes
of this will get process memory up to ~2.5 GB.  At that point it
crashes.
 
I'm new here, am I in the right place?
--
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/___
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users