トップ回答者
実装メモリの確認方法

質問
-
お世話になります。
Windows 7 , VS2008の.NETFramework3.5で開発しております。
PCに搭載されている実装メモリが一定値以下なら警告を出すようにしたいと思っています。参照設定でMicrosoft.VisualBasicを追加し、 以下のコードで物理メモリが確認できる所まできています。
Microsoft.VisualBasic.Devices.ComputerInfo info = new Microsoft.VisualBasic.Devices.ComputerInfo(); Debug.WriteLine( "物理メモリ = " + info.TotalPhysicalMemory.ToString() );
さて、チップセット内蔵のビデオ機能を使用している場合、タスクマネージャのパフォーマンスタブの物理メモリ(MB)の合計値
を見ていると物理メモリが100MB程減少することがわかりました。調べてみるとこれは正常な動作のようです。一方、コントロールパネルのシステムで確認できる実装メモリは減少前のメモリが表示されているように思います。
ビデオカードを挿す/オンボードのものを使用する、にかかわらず、搭載メモリが2GB以下なら警告を出すように
したいのですが、搭載メモリ(実装メモリ?)の情報を取得する方法を教えていただけませんか。以上、ご教授宜しくお願いいたします。
- 編集済み せれ 2012年1月12日 0:38
回答
-
試行してみたのですが、
Win32_PhysicalMemory.Capacity : 1073741824
という結果になりました。ヒント。「物理的なメモリ デバイス」の、「TotalMemorySize」(全メモリ量)ではなく、「Capacity」(能力、容量)が求まります。
って、時間をかけても仕方がないので、私が試したコードも載せておきます。
// 新しい、C# Windows Fom プロジェクトを作成。 // 「参照の追加」で、System.Management を追加。 // 次のコマンドで、WMI クラスを作成し、プロジェクトに追加。 // mgmtclassgen Win32_PhysicalMemory /L CS /O Practice14 /P Win32_PhysicalMemory.cs // フォームに、ListBox を1つ追加。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Practice14 { public partial class Form1 : Form { public Form1() { InitializeComponent(); PhysicalMemory.PhysicalMemoryCollection ms = PhysicalMemory.GetInstances(); ulong total = 0; foreach (PhysicalMemory m in ms) { total += m.Capacity; listBox1.Items.Add(m.Capacity.ToString("n0")); } listBox1.Items.Add(total.ToString("n0")); } } }
Jitta@わんくま同盟- 回答としてマーク せれ 2012年1月26日 2:17
すべての返信
-
2GB以下で警告するということは3GBかそれ以上を要求するという意味では?
(誤)搭載メモリが2GB以下なら
(正)搭載メモリが2GB未満なら
でした。話の本筋ではないですが、要求は2GB以上です。チップセット内蔵のビデオ機能が物理メモリを使用した場合、OS及びアプリケーションからアクセスできなくなるわけですから、TotalPhysicalMemoryの値が減少するのは妥当かと。
とは言え、100MBぐらいどっちでもいいように思いますが。今どき128MB SIMMを16枚挿している人がいて、その人に17枚目を挿すようお願いするわけじゃないですよね?
PCの構成が異なった時、チップセット内蔵のビデオ機能が使用する物理メモリがどの程度変わるのか感覚を持っていませんので、えいやで閾値を設定するのは危険かなという思いと、コントロールパネル上で表示できているのだからプログラムで実装する方法があるのかなと思いから投稿しました。
搭載メモリが1.5Gの場合はさすがに警告を出したいと思っています。
-
WMI の、Win32_ComputerSystem に TotalPhysicalMemory というメンバーがあり、これにアクセスするとよさげです。
Total size of physical memory. Be aware that, under some circumstances, this property may not return an accurate value for the physical memory. For example, it is not accurate if the BIOS is using some of the physical memory. For an accurate value, use the Capacity property in Win32_PhysicalMemory instead.
おっと、ダメか。「BIOS が使うなどの理由で異なっていることがあるから、Win32_PhysicalMemory.Capacity プロパティを使え」ということです。→サンプル:物理メモリの一覧を取得する: Win32_PhysicalMemory - WMI Sample (VBS)(wmifun.net)
C# から WMI を呼び出す方法がわからなかったので「C# WMI」で検索すると、ピッタリのスレッドがありました→C# WMIのデータ取得を高速化したい
Jitta@わんくま同盟 -
試行してみたのですが、
Win32_PhysicalMemory.Capacity : 1073741824
という結果になりました。ヒント。「物理的なメモリ デバイス」の、「TotalMemorySize」(全メモリ量)ではなく、「Capacity」(能力、容量)が求まります。
って、時間をかけても仕方がないので、私が試したコードも載せておきます。
// 新しい、C# Windows Fom プロジェクトを作成。 // 「参照の追加」で、System.Management を追加。 // 次のコマンドで、WMI クラスを作成し、プロジェクトに追加。 // mgmtclassgen Win32_PhysicalMemory /L CS /O Practice14 /P Win32_PhysicalMemory.cs // フォームに、ListBox を1つ追加。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Practice14 { public partial class Form1 : Form { public Form1() { InitializeComponent(); PhysicalMemory.PhysicalMemoryCollection ms = PhysicalMemory.GetInstances(); ulong total = 0; foreach (PhysicalMemory m in ms) { total += m.Capacity; listBox1.Items.Add(m.Capacity.ToString("n0")); } listBox1.Items.Add(total.ToString("n0")); } } }
Jitta@わんくま同盟- 回答としてマーク せれ 2012年1月26日 2:17
-
> 搭載メモリが1.5Gの場合はさすがに警告を出したいと思っています。
一度も、なぜこのようなチェックが必要なのか理由をかかれていないようですが、なぜでしょうか?搭載メモリ量がどれだけ多くても、予約されていて使えない領域があることを知りたいわけではないですよね?
アプリケーションが機能するために、ある程度のメモリに余裕が必要ということであれば、予約された領域が減らされた容量を知りたいはずです。そして、それは既に ComputerInfo から手に入っているわけですよね。
最近は、HDD高速化ツールや、SSDの書き込み回数減少のためのキャッシング ツール、大型のRAMDISKユーティリティ等があり、多くのメモリ領域が予約されているユーザも結構います。
参考までに、私のローカル環境では
Windows 7 (64bit), 搭載メモリ 16GB 予約 4GB (DVD編集するときだけ6GB)
WindowsXP (32bit), 搭載メモリ 8GB 予約 5GB (どうせ使えないのでRAMDISKに)といったかんじになっています。(Windows 7 では Jitta さんが書かれている方法できちんと 16GB が取得できます)
ビデオカード用に予約しているわけではありませんが、最近のビデオカードでは 1GB 以上のメモリを消費するものもありますので、メインメモリからビデオカードが予約する容量もそれなりに増えてきているかもしれません。
-
皆様、返事が遅くなって申し訳ありません。
Jitta様
コードサンプルありがとうございます。
おかげさまで、無事やりたいことができました。K.Takaoka様
> 搭載メモリが1.5Gの場合はさすがに警告を出したいと思っています。
一度も、なぜこのようなチェックが必要なのか理由をかかれていないようですが、なぜでしょうか?搭載メモリ量がどれだけ多くても、予約されていて使えない領域があることを知りたいわけではないですよね?
お客様からの要望が、「推奨環境を仕様に明記しており、推奨環境以下のマシンでは警告メッセージを出して欲しい」だったからです。メモリの推奨環境は2GBでした。
そこで、冒頭の私のコードで実装を行ったのですが、お客様から実装メモリが2GBなのに警告がでるぞと言われまして・・・。皆様ありがとうございました。これで解決とさせて頂きます。