Чрезмерное использование памяти в Matplotlib imshow - PullRequest
4 голосов
/ 02 марта 2012

У меня есть приложение PyQT4, которое отображает изображения среднего размера на рисунке Matplotlib. Тестовое изображение, которое я показываю, составляет около 5 МБ (2809 x 1241 пикселей). Я прочитал в данных, используя GDAL, кстати. Изображение считывается в массив с замаскированными значениями узлов. Затем это отображается с нормализованными значениями и указанной цветовой картой

Кажется, для отображения файла 5 МБ используется чрезмерное количество памяти. Я вижу, что для отображения этого изображения в полном разрешении требуется 140 Мб памяти. (приложение с imshow закомментировало использованную 60 Мб памяти против 206 с ней). Проблема усугубляется тем, что изображения отображаются на нескольких рисунках, поскольку каждый из них использует дополнительные 200 м памяти. При отображении примерно 3 или 4 цифр приложения начинают тормозить, когда объем используемой памяти достигает 700-900 МБ.

Я понимаю, что 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 Ответ

1 голос
/ 23 января 2013

Замечена проблема с использованием imshow() памяти, как здесь .

1 / Обновление

Как уже упоминалось, обновление до последней версии mpl может решить проблему .

2 / PIL

В качестве альтернативы вы можете использовать библиотеку PIL.

Когда дело доходит до файлов jpg, imshow () использует PIL, если он установлен. Вы можете использовать модуль PIL напрямую, , как описано здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...