LabVIEWでグラフ表示器に表示する際のメモリ使用量 (1/2)

こんにちはドルフィンシステム福島です。

LabVIEWにはグラフ表示器が用意されていて、メモリ上のデータを簡単にプロットさせることが出来ます。

しかし大量のデータを表示させるときにはメモリ使用量が増大するので注意が必要です。グラフ描画のタイミングによっては、Out Of Memory例外が発生しアプリが落ちてしまいます。

今回 LabVIEWでグラフ表示器に表示する際のメモリ使用量 (1/2)
次回 LabVIEWでチャート表示器に表示する際のメモリ使用量 (2/2)

動作確認環境

  • LabVIEW 2022 Q3 (32bit)
  • LabVIEW 2022 Q3 (64bit)


大量のデータをグラフ表示することについて

「大量のデータをグラフ表示」とは、1M x 1Mなどの大きな配列をグラフに表示することです。

賢明な読者の方は既にお気づきと思いますが、PCの画面サイズは精々4Kなので描画可能な最大サイズは4000 x 3000ピクセル程度になります。このサイズに1M x 1Mを描画しても適当に圧縮して表示されてしまうので、全データがdot by dotで表示されるわけではありません

よって大量のデータをグラフ描画する際は、実際に描画するグラフサイズに合うようにデータを平均化して間引くなど現実的なサイズにデータを縮小することがおすすめです。

ただもろもろの事情でデータサイズ縮小が出来ない場合があります。

例えば、

  • 「データを間引く方式が正しいか分からない」
  • 「間引くすることで見えないデータが出てくる可能性は避けたい」
  • 「全体も把握したいし圧縮されてないのデータも見たい」

などの要望が現実にはあります。

この場合は、大量のデータを描画しておけばデータ全体を把握できますし、グラフのズーム機能を使用すれば「圧縮されてしまったグラフの一部」を圧縮されていない状態で見る事も可能です。


グラフのメモリ使用量調査

グラフはどの程度メモリを消費するのでしょうか?

以下の様なVIを使用して、

  • VI起動時のメモリ使用量
  • 表示するデータを生成したときのメモリ使用量
  • グラフにプロットしたときのメモリ使用量

を調査します。


このVIの動作は、

  • 起動時にグラフに表示するデータを生成(デフォルトは100MBの配列)

  • plotボタンが押下されたら描画し

その時のメモリ使用量を表示します。


起動してからデータ生成後、100M程使用量が増えました。計算通りですね。


plotボタンを押下すると、グラフが描画されます。
さらに200M消費したようです。


clear plotボタンを押下してグラフを消去すると、増加した200Mが減りました。
どうもグラフ内部で消費されているようです。


まとめると下表になります。

グラフ描画をするとグラフ内部で描画するデータサイズの倍量を使用するようです。グラフをクリアすると使用量が元に戻るので、グラフ制御器が内部で使用しているメモリのようです。

場面使用量
起動時62M0
データ生成163M101M
plot361M200M
clear plot163M-200M


メモリ使用量を詳しくモニタリングする

このときのメモリ使用量をパフォーマンスモニタでモニタリングしました。

すると起動→100M確保→グラフプロット→グラフ消去という各段階でメモリが確保されたり、解放される様子が分かります。ちなみにグラフプロットを連打すると、メモリの解放前に描画を開始するようでタイミングによっては更に倍のメモリ使用する場面がありました。描画するタイミングによってはメモリ解放が間に合わず、一時的に倍量のメモリ使用量になる。


グラフプロットを連続して行う場合は、瞬間的にメモリ不足に陥ってOut Of Memoryエラーで落ちないように注意が必要ですね。ちなみにLabVIEW 32bitでも64bitでも同じ傾向でした。


強度グラフでも試しましたが、全く同じメモリ使用量と確保/解放の傾向が観察できました。


まとめ

  • グラフにプロットを実行した際に、プロットするデータ量の倍量のメモリを使用する。
  • グラフに空データを渡すとグラフがクリアされ、グラフが使用したメモリが解放される。
  • 連続してグラフにプロットを実行すると、メモリ解放が間に合わない場合は、瞬間的にプロットするデータ量の4倍量のメモリを消費する。

グラフに大容量のデータをプロットすることがたまにあります。

このような際には気をつけたいですね。

以上、ドルフィンシステム福島でした。

コメント