On 2/2/2011 5: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.
>
> -robert
>


Matplotlib converts all images to float64 RGBA before plotting. The 
memory usage increases 32 times when plotting 8 bit images. E.g. at 
least 512 MB contiguous free memory is required for plotting 16 MB uint8 
data.

Christoph

------------------------------------------------------------------------------
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