2012-03-01 5 views
4

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() 
+1

나는 약간 비슷한 문제가있어서'show()'대신'draw()'를 사용하고 imshow 객체를 삭제하여 해결했습니다. 예 :'self.im = imshow (your_data)','draw()','del self.im'. 이 사건이 맞는지 모르겠다. – maupertius

답변