2016-08-23 16 views
0

My Python QApplicationには、クリックするとpyqtgraph Plotを起動するボタン(メインウィンドウ上)があります。下のコードは、プロットがクラス内でどのように生成されるかを示しています。Pyqtgraph Plotが閉じられているときにメモリが解放されない

self.win = pg.GraphicsWindow() 
self.win.setWindowTitle(self.title) 
self.p = self.win.addPlot() 
self.curve = self.p.plot(self.Data1) 

私が気づいたことの1つは、アプリケーションでプロットウィンドウを閉じるとメモリが解放されないということです。例えば、ボタンが押される前に、アプリケーションは約20Mbを取ります。ボタンをクリックしてプロットを開始すると、これは25Mbに増加します。しかし、プロットを閉じると(右上隅のxをクリックして)、アプリケーションのメモリフットプリントは25Mbのままです。プロットが閉じられているときにこの5Mbのメモリを解放する方法はありますか(プロットがリアルタイムで更新されている間、私にはself.curve.clear()のラインがあるので、リークはありません)。

close()またはcloseEvent()の方法を変更する場合があります。または、何らかの形でオブジェクトへの参照を削除します(ただし、どのように行われるかわかりません)。

読んでいただきありがとうございます!

答えて

0

いくつかのことがあります。

  1. ウィンドウを閉じるだけでは、明示的に何かの割り当てを解除することはありません。はい、内部的には、ウィンドウ構造はもはや使用されませんが、それはGUIツールキットが計算したすべてを捨てることを賢明にするわけではありません - 次のウィンドウにも関連する部分かもしれませんか?
  2. Pythonには、(プログラム実行時の視点から)非決定的なものがあります。典型的なガベージコレクションです。したがって、オブジェクトへの最後の参照を失うと、オブジェクトが使用するメモリが即座に解放されるという保証はありません。
  3. これは誤解かもしれません。言語ランタイムのスクリプティングは即座に実行されます。freeすぐには割り当てられていないメモリそれはもう知っている - それは恐ろしい戦略なので、ヒューリスティックには、少なくともその部分をもう一度必要とする可能性が高いからです。そして真剣に、5MBのメモリ(予約されている?マップされている)は、Python GUIを実行しているマシンではそれほどではありませんので、早く解放するメリットはありません。そうすることは、おそらく悪いランタイム設計として批判されるでしょう。
+0

マーカスさんありがとう!私は、5Mbはそれほど多くはないが、例えば、私は繰り返しプロットを開いたり閉じたりします。これは、おそらく私がオブジェクトの割り当てを解除していないことを私に示唆していたので、メモリ保持を避けるためにプロットを閉じる適切な方法について尋ねると考えました。 – user6714459

関連する問題