On Wed, Feb 2, 2011 at 8:06 PM, Eric Firing <efir...@hawaii.edu> wrote:

> On 02/02/2011 03:08 PM, Robert Abiad wrote:
> > On 2/2/2011 3:59 PM, Christoph Gohlke wrote:
> >> On 2/2/2011 3:33 PM, Robert Abiad wrote:
> >>> Hello All,
> >>>
> >>> I'm very new to python, so bear with me.
> >>>
> >>> I'd like to use python to do my image processing, but I'm running into
> behavior that doesn't make
> >>> sense to me.  I'm using Windows 7 Pro (64-bit) with 4 gigs of memory,
> python 2.6.6, and the newest
> >>> versions of ipython, pyfits, matplotlib (1.0.1), numpy (1.5.1), scipy.
>  I'm loading in a fits file
> >>> that's 26 MB (~16 Mpixels).  When I load my image in ImageJ, I can see
> memory usage go up by 50MB,
> >>> but when I try displaying the image using imshow(), my memory usage
> goes up by around 500MB, each
> >>> time.  If I close the figure and replot it, imshow() crashes.  I don't
> know if I'm doing something
> >>> wrong, or if it's a new or known bug.  I tried the same thing on Linux
> and got the same result.
> >>> Here's a transcript.
> >>>
> >>>       Welcome to pylab, a matplotlib-based Python environment.
> >>>       For more information, type 'help(pylab)'.
> >>>
> >>> In [1]: import pyfits
> >>>
> >>> In [2]: from Tkinter import *
> >>>
> >>> In [3]: import tkFileDialog
> >>>
> >>> In [4]: image=pyfits.getdata(tkFileDialog.askopenfilename())
> >>>
> >>> In [5]: imshow(image)
> >>> Out[5]:<matplotlib.image.AxesImage object at 0x03BCA170>
> >>>
> >>> In [6]: close()
> >>>
> >>> In [7]: imshow(image,origin='lower')
> >>> Out[7]:<matplotlib.image.AxesImage object at 0x0440E170>
> >>>
> >>> In [8]: close()
> >>>
> >>> In [9]: imshow(image[100:3600,100:3600],origin='lower')
> >>> Out[9]:<matplotlib.image.AxesImage object at 0x045D9FB0>
> >>>
> >>> In [10]: Exception in Tkinter callback
> >>> Traceback (most recent call last):
> >>>       File "C:\app\Python2.6\lib\lib-tk\Tkinter.py", line 1410, in
> __call__
> >>>         return self.func(*args)
> >>>       File "C:\app\Python2.6\lib\lib-tk\Tkinter.py", line 495, in
> callit
> >>>         func(*args)
> >>>       File
> "C:\app\Python2.6\lib\site-packages\matplotlib\backends\backend_tkagg.py",
> line 263, in
> >>> idle_draw
> >>>         self.draw()
> >>>       File
> "C:\app\Python2.6\lib\site-packages\matplotlib\backends\backend_tkagg.py",
> line 248, in draw
> >>>         FigureCanvasAgg.draw(self)
> >>>       File
> "C:\app\Python2.6\lib\site-packages\matplotlib\backends\backend_agg.py",
> line 394, in draw
> >>>         self.figure.draw(self.renderer)
> >>>       File "C:\app\Python2.6\lib\site-packages\matplotlib\artist.py",
> line 55, in draw_wrapper
> >>>         draw(artist, renderer, *args, **kwargs)
> >>>       File "C:\app\Python2.6\lib\site-packages\matplotlib\figure.py",
> line 798, in draw
> >>>         func(*args)
> >>>       File "C:\app\Python2.6\lib\site-packages\matplotlib\artist.py",
> line 55, in draw_wrapper
> >>>         draw(artist, renderer, *args, **kwargs)
> >>>       File "C:\app\Python2.6\lib\site-packages\matplotlib\axes.py",
> line 1946, in draw
> >>>         a.draw(renderer)
> >>>       File "C:\app\Python2.6\lib\site-packages\matplotlib\artist.py",
> line 55, in draw_wrapper
> >>>         draw(artist, renderer, *args, **kwargs)
> >>>       File "C:\app\Python2.6\lib\site-packages\matplotlib\image.py",
> line 354, in draw
> >>>         im = self.make_image(renderer.get_image_magnification())
> >>>       File "C:\app\Python2.6\lib\site-packages\matplotlib\image.py",
> line 569, in make_image
> >>>         transformed_viewLim)
> >>>       File "C:\app\Python2.6\lib\site-packages\matplotlib\image.py",
> line 201, in _get_unsampled_image
> >>>         x = self.to_rgba(self._A, self._alpha)
> >>>       File "C:\app\Python2.6\lib\site-packages\matplotlib\cm.py", line
> 193, in to_rgba
> >>>         x = self.norm(x)
> >>>       File "C:\app\Python2.6\lib\site-packages\matplotlib\colors.py",
> line 820, in __call__
> >>>         result = (val-vmin) / (vmax-vmin)
> >>>       File "C:\app\Python2.6\lib\site-packages\numpy\ma\core.py", line
> 3673, in __div__
> >>>         return divide(self, other)
> >>>       File "C:\app\Python2.6\lib\site-packages\numpy\ma\core.py", line
> 1077, in __call__
> >>>         m |= filled(domain(da, db), True)
> >>>       File "C:\app\Python2.6\lib\site-packages\numpy\ma\core.py", line
> 772, in __call__
> >>>         return umath.absolute(a) * self.tolerance>= umath.absolute(b)
> >>> MemoryError
> >>>
> >>>
> >>> Thanks for any help,
> >>> -robert
> >>>
> >>
> >>
> >> These are previous discussions on the issue:
> >>
> >> <
> http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg14727.html
> >
> >> <
> http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg19815.html
> >
> >> <
> http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg19614.html
> >
> >>
> >> Christoph
> >>
> >
> > The first 2 discussions lead to suggestions of more memory on a 64-bit
> installation, but that
> > doesn't seem like a great solution.  I use other image processing
> software (ImageJ and IDL) and
> > neither has any trouble with my images.  As I mentioned ImageJ uses
> 1/10th the memory for the same
> > display, or about 1 byte of memory for 1 byte of image.  I think
> matplotlib should aim for the same.
> >    I also think it should free up memory when the image is closed, but
> maybe I'm not doing the right
> > thing.  Is there something else I should be doing to free up memory?
> >
> > Things are even worse with plot.
> >
> > I'll file a bug report as Benjamin suggests.
>
> Please file it in the "enhancement" category, not as a "bug".  The
> difficulty that mpl has with images is the result of a design decision
> long ago; as Christoph notes, mpl works primarily with float64 rgba,
> which is horribly memory inefficient, but is very general and works fine
> so long as the image is not too large.  uint8 is already used in some
> circumstances.  I don't know how hard it would be to simply switch to
> uint8 for images, or to make that an option, perhaps for all color
> specification.  It may involve getting into arcana of the extension code
> and the agg library, which is a daunting prospect for most of us,
> certainly for me.  I agree entirely that a major reduction in memory
> usage would be good; patches, or a mpl branch to achieve that, are welcome.
>
> Eric
>
>
As a possible stop-gap solution, maybe we could consider the compressed
arrays (carry)?

I am not a fan of doing special cases, though, especially at the very
base/core portions of the library.

Ben Root
------------------------------------------------------------------------------
Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)!
Finally, a world-class log management solution at an even better price-free!
Download using promo code Free_Logger_4_Dev2Dev. Offer expires 
February 28th, so secure your free ArcSight Logger TODAY! 
http://p.sf.net/sfu/arcsight-sfd2d
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to