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