1

非常に頻繁にアクセスする必要がある (静的) テーブルがあります。したがって、実行時にキャッシュします。

今のところ、DataTable を使用して情報を保存し、Select() を使用して情報を取得しています (通常、フィルタリングは 2 つまたは 3 つの列に分散しています)。しかし、これは非常に (!) 遅く、主要なボトルネックになっているようです。

したがって: DB テーブル (.Net 2.0) をキャッシュする最良の方法と、それに最も速くアクセスする方法は何ですか?


[編集1]

DataTable cache = new DataTable();
cache.Columns.Add("id", typeof(int));
cache.Columns.Add("data_id", typeof(int));
cache.Columns.Add("data", typeof(string));
cache.Columns.Add("value", typeof(float));

例えば:

DataRow[] result1 = cache.Select("id = 1 AND data_id = 2 AND data = 'some data'");
DataRow[] result2 = cache.Select("data = 'some other data'", "data desc");

[編集2]

@MichaelPerrenoud からの提案を念頭に置いて、辞書を実装することになりました。この設計は、キャッシュする必要がある DB テーブルの構造に関するものであることに注意してください。

Dictionary<string, Dictionary<NewObject, float>> cache;
class NewObject {int id; int data_id;}

このようにして、キャッシュは [キー]としてデータを持ち、[値] として新しい辞書を持ちます。そして、この後者は [キー] としてid + data-idを持ち、[値] としてvalueを持ちます。

データへのアクセスでは、このディクショナリはDataTable より~%90高速です。

4

1 に答える 1

1

ですから、あなたにとって良い解決策はこのようなものだと思います。私はあなたが最初DataTableにデータを取得した後にあなたが持っていると仮定しています。

免責事項:私はこのコードをコンパイルしていません-それは概念です-あなたはいくつかの構文を修正する必要があるかもしれません。

Dictionary<string, List<DataRow>> CacheData(DataTable t, params string[] fields)
{
    Dictionary<string, List<DataRow>> cache = new Dictionary<string, List<DataRow>>();
    StringBuilder key = new StringBuilder();

    foreach (DataRow r in t.Rows)
    {
        key.Clear();
        foreach (string f in fields)
        {
            if (key.Length > 0) { key.Append("_"); }
            key.Append(Convert.ToString(r[f]);
        }

        if (!cache.ContainsKey(key.ToString())) { cache.Add(key.ToString(), new List<DataRow>()); }
        cache[key.ToString()].Add(r);
    }
    return cache;
}

これで、これらの辞書を適切と思われる方法で保存し、必要に応じてデータを引き出すことができます。たとえば、最初の例を処理する必要がある場合は、キャッシュを作成するために次のようになります。

CacheData(table, "id", "data_id", "data");

次に、データを取得するには、次のような文字列を作成します。

string key = "1_2_some data";

次のように、辞書から行のリストを引き出します。

dictionary[key];

そしてそれはあなたが使用するためにを返しList<DataRow>ます。


ただし、これを1回だけ実行してから、それらの辞書を何度も活用する必要があります。

于 2013-03-19T16:46:40.630 に答える