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