Matplotlib imshow中的内存使用过多

时间:2012-03-01 23:16:10

标签: python matplotlib

我有一个PyQT4应用程序,它在Matplotlib图中显示中等大小的图像。我正在显示的测试图像大约是5Mb(2809 x 1241像素)。顺便说一下,我使用GDAL读取数据。图像被读入一个掩盖了nodata值的数组。然后使用标准化值和指定的色彩图

显示

似乎使用过多的内存来显示5mb的文件。我所看到的是,以全分辨率显示此图像需要140mb的内存。 (使用imshow的应用程序注释掉使用了60mb的内存,而206则使用了它)随着图像以多个数字显示,每个人使用额外的200m内存,问题变得更糟。当显示大约3或4个数字时,应用程序开始停滞,因为内存使用量达到700-900 mb范围。

我理解matplotlib必须存储所有像素,即使它只显示下采样子集以匹配屏幕分辨率。我可能最终会编写例程,只读取一定数量的像素来匹配数字大小。但是由于这个应用程序将在8个独立的屏幕上显示多达8个地图,我担心它仍然使用过多的内存。

所以我的问题是:
1)这看起来像是用于显示简单的彩色贴图图像的过多内存吗?它对我有用。

2)我有什么办法可以减少这种内存使用量吗?例如,使用整数数据类型,释放内存等

3)我应该使用哪些其他策略来处理这种内存使用?例如,下采样(在全屏分辨率1900x1200下可能不是非常有效),切换到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:\vistrails\workingfiles\secondseason\secondseason_workfile_2012_02_28b\brt_1\brt_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()

1 个答案:

答案 0 :(得分:1)

使用imshow()的内存问题已被注意到,here

1 /升级

正如这里提到的,upgrading to latest vesion of mpl may fix the problem

2 / PIL

作为替代方案,您可以使用PIL库。

当它转到jpg文件时,imshow()正在使用PIL(如果已安装)。您可以直接使用PIL模块as documented here