- PR -

C# WMIのデータ取得を高速化したい

1
投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2005-11-30 14:27
WMIデータの抽出が重いです。
WMIの抽出処理を高速にする工夫は無いでしょうか?
やはりWQLで(SELECT文)を使用しているのが効率悪化の一因なのでしょうか?
SELECT文を使わずに抽出する方法をあると聞きましたが、方法が分かりません。
単純な抽出の場合SELECT文を使わずに済むなら高速化できそうな気がします。



/// <summary>
/// OS情報
/// </summary>
public class Win32_OperatingSystem : WQL
{
/// <summary>
/// コンストラクタ
/// </summary>
public Win32_OperatingSystem() : base("SELECT TotalVisibleMemorySize,FreePhysicalMemory FROM Win32_OperatingSystem")
{
}

/// <summary>
/// 物理メモリ(合計)
/// </summary>
/// <param name="index 番号"></param>
/// <returns></returns>
public ulong TotalVisibleMemorySize(int index)
{
object temp1 = Get("TotalVisibleMemorySize",index);
return temp1 == null ? 0 : (ulong)temp1;
}

/// <summary>
/// 物理メモリ(利用可能)
/// </summary>
/// <param name="index 番号"></param>
/// <returns></returns>
public ulong FreePhysicalMemory(int index)
{
object temp1 = Get("FreePhysicalMemory",index);
return temp1 == null ? 0 : (ulong)temp1;
}
}


/// <summary>
/// WQL検索エンジン
/// </summary>
public abstract class WQL
{
/// <summary>
/// コンストラクタ(WMIに問い合わせる)
/// </summary>
/// <param name="query"></param>
public WQL(string query)
{
_query = query;

ManagementScope scope = new ManagementScope("root\\cimv2");
scope.Connect();

System.Management.ObjectQuery q = new System.Management.ObjectQuery(_query);

ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, q);
ManagementObjectCollection collection1 = searcher.Get();
_list = new ManagementObject[collection1.Count];
collection1.CopyTo(_list,0);
}


/// <summary>
/// 問い合わせたデータから項目を抽出する
/// </summary>
/// <param name="item 項目名"></param>
/// <param name="index 番号"></param>
/// <returns></returns>
protected object Get(string item,int index)
{
return _list[index].GetPropertyValue(item);
}

/// <summary>
/// データ件数
/// </summary>
public int Count
{
get
{
return _list.Length;
}
}

private ManagementObject[] _list;
private string _query;
}
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2005-11-30 23:50
引用:
WMIの抽出処理を高速にする工夫は無いでしょうか?



C# に関してはまったく疎いですが。

EnumerationOptions.ReturnImmediately プロパティ
と思ったんですけど、Default True のようなので、

EnumerationOptions.Rewindable プロパティ
を False にしてみる?

引用:
SELECT文を使わずに抽出する方法をあると聞きましたが、



ManagementObject.Path に 対象の WMI Path を渡してやればできないのですかね。

[ メッセージ編集済み 編集者: ちゃっぴ 編集日時 2005-12-01 00:08 ]
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2005-12-01 03:29
南部です。

ローカルマシンのTotalVisibleMemorySize、FreePhysicalMemory
を取得してみましたが、600ミリ秒ほどでした。
(スペックはPen4の2.54GHz)

コードは自分で書くのがめんどうだったので(こんな時間だし)
mgmtclassgenを使用しました。

提示されたコードとの速度比較はしていませんので、
なんともいえませんが、参考まで。

#計測ミスのため修正

[ メッセージ編集済み 編集者: nanbu 編集日時 2005-12-01 03:53 ]
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2005-12-01 18:48
ご回答ありがとうございます。
WMIへのアクセスが軽くなりました。

(WMIは使いやすいので最近少しはまっています)
1

スキルアップ/キャリアアップ(JOB@IT)