python – Matplotlib imshow中的内存使用过多
我有一个PyQT4应用程序,它在Matplotlib图中显示中等大小的图像.我正在显示的测试图像大约是5Mb(2809 x 1241像素).顺便说一下,我使用GDAL读取数据.图像被读入一个掩盖了nodata值的数组.然后使用标准化值和指定的色彩映射显示
它似乎使用过多的内存来显示5mb文件.我所看到的是,以全分辨率显示此图像需要140mb的内存. (使用imshow的应用程序注释掉使用了60mb的内存,而206则使用了它)随着图像以多个数字显示,每个人使用额外的200m内存,问题变得更糟.显示大约3或4个数字时,应用程序开始停滞,因为内存使用量达到700-900 mb范围. 我理解matplotlib必须存储所有像素,即使它只显示一个下采样子集以匹配屏幕分辨率.我可能最终会编写例程,只读取一定数量的像素来匹配数字大小.但是由于这个应用程序将在8个独立的屏幕上显示多达8个地图,我担心它仍然使用过多的内存. 所以我的问题是: 2)我有什么办法可以减少这种内存使用量吗?例如,使用整数数据类型,释放内存等. 3)我应该使用哪些其他策略来处理这种内存使用?例如,下采样(在全屏分辨率1900×1200下可能不是非常有效),切换到64位架构等 谢谢, import sys,os,random from PyQt4.QtCore import * from PyQt4.QtGui import * import matplotlib from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar from matplotlib.figure import Figure import matplotlib.colors as colors import numpy as np from osgeo import gdal,gdalconst gridfile = r"i:vistrailsworkingfilessecondseasonsecondseason_workfile_2012_02_28bbrt_1brt_prob_map.tif" class AppForm(QMainWindow): def __init__(self,parent=None): QMainWindow.__init__(self,parent) self.create_main_frame() ds = gdal.Open(gridfile,gdal.GA_ReadOnly) ary = ds.GetRasterBand(1).ReadAsArray(buf_ysize=500,buf_xsize=300) ndval = ds.GetRasterBand(1).GetNoDataValue() rasterdata = np.ma.masked_array(ary,mask=(ary==ndval)) del ary self.axes.imshow(rasterdataint,cmap=matplotlib.cm.jet) del rasterdata def create_main_frame(self): self.main_frame = QWidget() # Create the mpl Figure and FigCanvas objects. # 5x4 inches,100 dots-per-inch # self.dpi = 100 self.fig = Figure((5.0,4.0),dpi=self.dpi) self.canvas = FigureCanvas(self.fig) self.canvas.setParent(self.main_frame) self.axes = self.fig.add_subplot(111) self.mpl_toolbar = NavigationToolbar(self.canvas,self.main_frame) vbox = QVBoxLayout() vbox.addWidget(self.canvas) vbox.addWidget(self.mpl_toolbar) self.main_frame.setLayout(vbox) self.setCentralWidget(self.main_frame) def main(): app = QApplication(sys.argv) form = AppForm() form.show() app.exec_() if __name__ == "__main__": main() 解决方法
使用imshow()的内存问题已被注意到,如
here.
1 /升级 正如这里提到的,upgrading to latest vesion of mpl may fix the problem. 2 / PIL 作为替代方案,您可以使用PIL库. 当它转到jpg文件时,imshow()正在使用PIL(如果已安装).您可以直接使用PIL模块,as documented here. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |