Matplotlib 그림에 중간 크기 이미지를 표시하는 PyQT4 응용 프로그램이 있습니다. 표시하는 테스트 이미지는 약 5MB (2809 x 1241 픽셀)입니다. GDAL을 사용하여 데이터를 읽었습니다. nodata 값을 마스크 아웃하여 배열로 이미지를 읽습니다. 이것은 정규화 된 값과 지정된 색상 맵으로 표시됩니다.Matplotlib에서의 과도한 메모리 사용량
5MB 파일을 표시하는 데 과도한 양의 메모리가 사용 된 것 같습니다. 내가보기에는이 이미지를 풀 해상도로 표시하려면 140MB의 메모리가 필요하다는 것입니다. (imshow가 적용된 응용 프로그램은 60mb의 메모리를 사용하여 주석을 달았습니다.) 또한 이미지는 여러 개의 그림으로 표시 될 때마다 더 많은 메모리가 사용되므로 문제가 악화됩니다. 약 3 ~ 4 개의 숫자가 표시되면 메모리 사용량이 700-900 mb 범위로 증가함에 따라 응용 프로그램의 속도가 느려지 기 시작합니다.
화면 해상도와 일치하는 다운 샘플링 된 하위 집합 만 표시하는 경우에도 matplotlib가 모든 픽셀을 저장해야한다는 것을 알고 있습니다. 아마도 그림 크기와 일치하는 픽셀 만 읽도록 루틴을 작성하게 될 것입니다. 그러나이 응용 프로그램은 8 개의 개별 화면에 최대 8 개의지도를 표시하므로 과도한 메모리를 사용하는 것에 대해 우려하고 있습니다.
내 질문은 다음과 같습니다.
1) 단순한 컬러 맵 이미지를 표시하는 데 과도한 양의 메모리가 필요합니까? 그것은 나에게 도움이된다.
2)이 메모리 사용량을 줄이기 위해 할 수있는 일이 있습니까? 예를 들어 정수 데이터 유형, 메모리 해제 등을 사용합니다.
3)이 메모리 사용을 처리하기 위해 사용해야하는 다른 전략은 무엇입니까? 다운 샘플링 예를 들어, 64 비트 아키텍처 등
감사를 전환 (전체 화면 해상도 1900x1200에서 매우 효과적이지 않을 수 있음), 코드 imshow()
의 사용과
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()
나는 약간 비슷한 문제가있어서'show()'대신'draw()'를 사용하고 imshow 객체를 삭제하여 해결했습니다. 예 :'self.im = imshow (your_data)','draw()','del self.im'. 이 사건이 맞는지 모르겠다. – maupertius