LabVIEWで「メモリが一杯です」が発生する

更新しました Dec 4, 2023

使用製品

ソフトウェア

  • LabVIEW

問題

LabVIEWで大規模なアプリケーションを開発しているときに、使用可能なRAMが大容量であっても、次のエラーメッセージが表示されることがあります。
 

 

LabVIEW: メモリが一杯です。トップレベルVIは、ブロックダイアグラムで停止しました。VIのメモリ使用率の監視と改善方法については、『LabVIEWヘルプ』トピックを参照してください。


なぜこのエラーメッセージが表示されますか?

解決策

基本的に、大容量の配列、クラスタ、または波形のデータセットを持つアプリケーションを開発する場合、このメッセージが表示されることがあります。LabVIEWは各データセットを連続したメモリブロックに格納するため、コンピュータで使用可能なメモリブロックは、大きなデータセットを格納するのに十分な大きさではない場合があります。
 

このメッセージが表示されないようにするには、以下の推奨事項を試してみてください。



 

配列、クラスタ、または波形が使用するメモリを削減する

 
  • 大きなデータセットを持つ配列を使用している場合は、可能であれば、より小さなデータタイプを配列に配線します。たとえば、配列が倍精度浮動小数点数[DBL]で0から100の範囲の整数を格納する場合、整数表現を符号なし8ビット整数[U8]に変更できます。U8データタイプが使用するメモリは、倍精度浮動小数点数が使用するメモリの8分の1となります。
  • LabVIEW 8.5以降では、In Place要素ストラクチャを使用して、配列、クラスタ、または波形を使用する際にデータのコピーを作成しないようにします。
  • 大容量の配列からデータをグラフ化する場合は、最大-最小デシメーションを使用してすべてのデータポイントをグラフ化しないようにします。最大-最小デシメーションの詳細については、LabVIEWヘルプ: 大きなデータセットのメモリ管理 を参照してください。
  • パフォーマンスおよびメモリをプロファイルツールを使用して、どのVIがメモリ使用量の原因となっているのかを確認します。原因を検索することで絞り込むことができます。詳しくは、LabVIEW VIで実行時間とメモリ使用量を監視する を参照してください。
  • 大きなデータセットを分析して、メモリが一杯になった場所を特定します。データをディスクにストリーミングまたは書き込みする際は、TDMSファイルやNI DIAdemソフトウェアなどの高性能解析/レポートツールを使用します。


 

アプリケーションでのメモリ使用量を削減する

 
  • LabVIEWがデータをコピーする回数を制限するには、アプリケーション内のグローバル変数ローカル変数の数を減らします。変数を使用する代わりに、生産者/消費者デザインパターンを使用してループを作成したり、新規データ値リファレンス関数を使用してデータへの参照を作成したりすることもできます。
  • サブVIが実行されていないときにメモリを利用できるように、コードのセクションをサブVIに分けます。
  • 可能であれば、大きなサブVIを非再入可能に設定します(非再入可能VIは、WindowsおよびリアルタイムVIのデフォルト設定です)。詳しくは、再入可能: 同じサブVIへの同時呼び出しを可能にするを参照してください。
  • 大規模なサブVIを動的に呼び出すには、リファレンス呼び出しノードを使用します。VIが動的に呼び出すまで、サブVIはメモリにありません。
  • パフォーマンスおよびメモリをプロファイルウィンドウを使用して、実行や時間に関するデータを取得して表示します。このウィンドウについて詳細は、LabVIEW VIで実行時間とメモリ使用量を監視する を参照してください。
  • NI LabVIEWデスクトップ実行トレースツールキットを使用して、メモリリークやリファレンスリークなどのパフォーマンスに悪影響を及ぼす可能性のある問題を特定します。プロファイルVI、実行可能ファイル、および共有ライブラリなどトレースの仮想メモリでコールチェーン、スレッドID、ロケーションなどの低レベル情報を収集します。


 

LabVIEWで使用できるメモリを増やす

 

追加情報

このメッセージが発生するのは、LabVIEWが配列に対して十分な大きさのメモリブロックを割り当てることができない場合が最も一般的です。たとえば、2,000×2,000要素の倍精度浮動小数点数である配列は、約32 MBを使用します。 32 MB以上のメモリが利用可能であっても、配列に十分な大きさのメモリブロックがない場合があります。


上記の例では、2の31乗以上の要素を含む配列がForループで指標化するときに発生します。配列には最大2の32乗個の要素を含めることができますが、Forループでは最大2の31乗の値しか指標化できません。これは、N端子がU32ではなくI32データ型を使用するためです。I32データタイプの最上位ビットは、値が正か負かを指定するために使用されます。