Matplotlibの図に中程度のサイズの画像を表示するPyQT4アプリケーションがあります。私が表示しているテスト画像は約5Mb(2809×1241ピクセル)です。 GDALを使用してデータを読み込みます。イメージは、nodata値がマスクされた配列に読み込まれます。これは正規化された値と指定されたカラーマップで表示されますMatplotlibでのメモリ使用量が極端に多いimshow
5MBのファイルを表示するには過度のメモリを使用するようです。私が見ているのは、このイメージを完全な解像度で表示するには140MBのメモリが必要だということです。 (imshowでコメントアウトされたアプリケーションでは60MBのメモリが使用されていましたが、206で使用されました)画像は複数の数字で表示されるので、問題は悪化します。約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