У меня есть приложение 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()