【LabVIEW】メモリ使用量のデータ取得 【WinAPI】

LabVIEWを用いてWindowsでどれくらいのメモリが使用されているのかを取得する方法について紹介をします。

本記事の要約

WindowsAPI 「GlobalMemoryStatusEx」を使用してWindowsのメモリ使用状況を取得する。

GlobalMemoryStatusExについて

GlobalMemoryStatusEx関数はWindowsの「Kernel32.dll」にある関数の一つです。

Windowsシステムで現在使用されている物理メモリと仮想メモリの両方についての使用状況を取得することが出来ます。

GlobalMemoryStatusEx関数は「構造体」と「戻り値」で構成されています。

GlobalMemoryStatusEx関数の構造体については9つのデータから構成されています。
構造体の詳細な内容については下記リンクを参照ください。
https://docs.microsoft.com/en-us/windows/win32/api/sysinfoapi/ns-sysinfoapi-memorystatusex

typedef struct _MEMORYSTATUSEX {
  DWORD     dwLength;
  DWORD     dwMemoryLoad;
  DWORDLONG ullTotalPhys;
  DWORDLONG ullAvailPhys;
  DWORDLONG ullTotalPageFile;
  DWORDLONG ullAvailPageFile;
  DWORDLONG ullTotalVirtual;
  DWORDLONG ullAvailVirtual;
  DWORDLONG ullAvailExtendedVirtual;
} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;
dwLength

構造体のサイズを表しています。(バイト単位)。GlobalMemoryStatusExの情報を読み込む前に、この設定する必要があります。

dwMemoryLoad

使用中の物理メモリのおおよその割合が表示されます。割合は0〜100の範囲で表示されます。(0はメモリが使用されていないことを示し、100はメモリが完全に使用されていることを示します)

ullTotalPhys

物理メモリの容量(バイト単位)。

パソコンに搭載されている物理メモリの容量を表示します。「バイト」単位で値を渡されるので、「ギガバイト」で表示をしたい場合は追加処理が必要です。

ullAvailPhys

使用可能な物理メモリの空き容量(バイト単位)。

ullTotalPageFile

システムまたは現在のプロセスの現在のコミットされたメモリ制限(小さい方)をバイト単位で表します。システム全体のコミットされたメモリ制限を取得するには、GetPerformanceInfo関数を呼び出してください。

ullAvailPageFile

現在のプロセスがコミットできるメモリの最大量(単位:バイト)。この値は、システム全体で利用可能なコミット値と同じか、それよりも小さい値です。

ullTotalVirtual

呼び出したプロセスの仮想アドレス空間のユーザーモード部分のサイズをバイトで表します。この値は、プロセスの種類、プロセッサの種類、オペレーティング・システムの構成によって異なります。

ullAvailVirtual

呼び出したプロセスの仮想アドレス空間のユーザーモード部分に現在存在する、予約されていない、コミットされていないメモリの量をバイトで表したもの。

ullAvailExtendedVirtual

予約済み。この値は常に0です。

GlobalMemoryStatusExをLabVIEWで使用する

GlobalMemoryStatusExをLabVIEWで扱う場合の方法については下記フォーラムに記載がありました。

GlobalMemoryStatusExをLabVIEWで扱うときのVIは上記のようになります。SimpleErrorHandler.VIは無くても問題ありません。

DLL関数を取り扱うために、「ライブラリ関数呼び出しノード」を使用し、ライブラリ名またはパスに「Kernel32.dll」を指定します。

関数名を「GlobalMemoryStatusEx」にします。似た関数で「GlobalMemoryStatus」というのもありますが、別物です。

戻り値は特にしていはしなくても良いので出力は無しでも問題ありません。タイプ「無効」で出力は無しになります。

「GlobalMemoryStatusEx」が正常に機能したかどうかを確認したいのであれば、戻り値を表示器へ入力してください。「0」以外が戻ってきていれば、関数が正常に動いています。失敗した場合は「0」が戻ってきます。

構造体についてはタイプを「タイプに適応」に設定をします。データ形式は「値によるハンドル」を選択します。

LabVIEWでの構造体についてですが、クラスタで構造体を表します。

入力データとしては「dwLength」のみ値を指定します。その他の項目については「0」を入力します。「dwLength」に「64」以外を入力すると、値は正常に読み込めませんでした。

メモリのサイズについては指定されている表記方法(U64)以外でも読み込むことは出来ますが、環境によっては値がオーバーフローをするため正常な値を取得できない可能性があります。

指定された表記方法を使用するのが望ましいです。

まとめ

「GlobalMemoryStatusEx」関数を使用することで、現在のメモリ使用状況を監視することが出来るようになるので、VIがメモリを想定よりも多く使用するような場合にプログラム側で止めることが出来るようになります。

32bit版のLabVIEWだとVIが使用できるメモリ容量は2GBまでですが、64bit版のLabVIEWだとメモリをあるだけ使用するため、メモリ制限をかけずに大きなデータを扱うと、使えるだけメモリを使用するためメモリがパンクする場合があります。

メモリの使用量が増えすぎないようにVIを組むことも大事ですが、万が一に備えてメモリの使用量も監視しておくのが無難な場合もあります。