2

私はこのクラスを持っています

public class Item
{
    public int UniqueKey;
    public int Key1;
    public int Key2;
    public int Key3;
    public int Key4;
    public string Value;
}

とコレクションIEnumerable<Item>

このコレクションのアイテムに、 Key1Key2、または複合インデックス(Key1とKey4 )でインデックスを作成したいと思います。収集品数は約1万点以上です。主な目標はパフォーマンスです。複数の発信者は、多くの読み取り/1回の書き込みアクセスを持つことができます。返されたコレクションは保護する必要があります(外部からの変更から保護します)。誰かがソリューション、パターン、実装に使用する必要のあるコレクションクラスについて説明してもらえますか。

いくつかの理由(パフォーマンスなど)のために、データベーステーブルのインデックスを使用するバリアントを拒否しました。

4

3 に答える 3

1

2 つのマッピングを使用できます。1 つはストア用で、もう 1 つは主キーへのルックアップ テーブルとして使用できます。すべての更新で修正が必要な主キーが使用されるため、ロック ストリッピングを使用して同時書き込みを許可できます。この形式では、ライターはロック (primaryKey mod # locks) を取得して、更新/削除がエントリを求めて競合しないようにする必要があります。もちろん、バッキング ディクショナリが並行している場合は、読み取りにロックは必要ありません。

優れた API を提供するためにキャッシュ ファサードの背後に隠されているこのアイデアの Javaバージョンを見ることができます。

于 2010-08-28T01:20:19.523 に答える
0

LINQ を使用して、プロパティによってインデックス付けされたコレクションを返すことができます。

var key1 = from i in Items 
           group i by i.Key1 into g
           select g;

var key2 = from i in Items
           group i by i.Key2 into g
           select g;
...

キーの小さな決定論的なリストがあるため、読み取り用のグループIEnumerableまたはListプロパティを公開するクラスを実装できます。コレクションにアイテムを追加するための単一のメソッドを追加します (値に基づいて読み取り用にグループ化されるため、個別のメソッドは必要ありません)。lockAdd メソッドでキーワードを使用して、追加中にアイテム コレクションを保護します。

于 2010-08-27T16:08:40.103 に答える
0

匿名型を使用してアイテムをグループ化し、グループで辞書を作成できます。

var grouped = items.GroupBy(item => new { item.Key1, item.Key4 })
                   .ToDictionary(g => g.Key, g => g.ToList());

ただし、匿名型はローカル変数 (またはジェネリック メソッド パラメーター) にのみ使用できるため、後で再利用するために辞書を保存する場合は、非匿名型が必要になります。したがって、可能なキーの組み合わせごとにタイプを作成するか、Tupleクラスを使用できます。

Dictionary<Tuple<int, int>, Item> grouped =
              items.GroupBy(item => Tuple.Create(item.Key1, item.Key2))
                   .ToDictionary(g => g.Key, g => g.ToList());
于 2010-08-27T17:14:08.853 に答える