LabVIEWで巨大な配列データ、複雑なクラス、大容量のクラスターを処理する際、「プログラムの動作がだんだん重くなる」「メモリ不足(Not enough memory)エラーが出る」といった壁にぶつかったことはありませんか?
LabVIEWはデータフローに従って自動的にメモリを管理してくれますが、ワイヤの分岐やデータの部分的な書き換えを行う際、内部でデータの「コピー(複製)」が大量に発生してしまうことがあります。このメモリの無駄なコピーを完全に防ぎ、元のメモリ領域を直接(インプレースで)書き換えるための特殊な制御構造が、In Place要素ストラクチャ(In Place Element Structure)です。
通常の「配列部分置換」や「名前でバンドル解除/バンドル」と比較して、以下のような圧倒的なパフォーマンス上のメリットがあります。
通常のワイヤ操作では、LabVIEWのコンパイラがコピーを最適化しきれない場合があります。In Place要素ストラクチャを使用すると、「この領域のメモリをそのまま再利用する」という指示をコンパイラに強制できるため、確実にメモリ使用量と処理時間を削減できます。
数メガ、数ギガバイトに及ぶ画像データや高サンプリング波形配列の一部分を書き換える際、全体をコピーし直す必要がなくなるため、処理速度が劇的に向上します。リアルタイム性が求められるインライン演算には必須の機能です。
LabVIEWのオブジェクト指向(LVOOP)において、クラスのプロパティを部分的に変更する際にも有効です。「非バインド」ノードをストラクチャの左右の壁に配置することで、メモリをクリーンに保ったまま安全なアクセサVIを記述できます。
ストラクチャの境界(壁)を右クリックし、「要素ノードを追加」から目的の処理パターンを選択して使用します。
配列の特定の要素(または部分配列)を読み出して計算し、同じインデックスに戻すパターンです。
左側の壁(入力ノード)から特定のインデックスのデータを取り出してストラクチャ内部で加工し、右側の壁(出力ノード)へと配線します。これにより、「配列の一部分をメモリ上で直接上書きする」という挙動になり、配列全体の複製が一切発生しません。
巨大なクラスターや入れ子(ネスト)になったクラスターの一部分だけを書き換えるパターンです。
ストラクチャの左壁で必要な項目だけを展開し、内部で演算した結果を右壁の同じ項目に戻します。通常の「名前でバンドル」関数を多用するよりもブロックダイアグラムが非常にすっきりと整理され、視覚的な可読性も高まります。
アナログ波形データ(Waveform型)に含まれる「Y配列(サンプリングデータ本体)」を直接操作したい場合に最適です。波形データのタイムスタンプ(t0)やサンプリング周期(dt)のメモリ領域を維持したまま、データ配列だけを高速に処理できます。
「長時間の連続運転を続けると、メモリリークのようになって徐々にPCの挙動が重くなる」「波形処理の演算がサンプリング周期内に間に合わず、処理遅れ(ジッタ)が出てしまう」といった、ソフトウェアのパフォーマンス不足にお悩みではありませんか?
測定代行株式会社は、LabVIEWを用いた高度なデータ処理・大規模システム開発の受託専門会社です。バッファ割り当てウィンドウを用いた詳細なメモリ解析や、In Place要素ストラクチャを駆使したメモリ最適化チューニングにより、PCやリアルタイムターゲット(cRIOなど)のハードウェア性能を極限まで引き出す、高速で堅牢なシステムを構築いたします。
新規プログラムの作成はもちろん、既存の重くなったVIのボトルネック診断・リファクタリング(高速化改修)まで、LabVIEWのことなら何でもお気軽にご相談ください。