1
public class User
{
   public int Id { get; set; }
   public int Age { get; set; }
   public string Name { get; set; }
}

私には10万人のユーザーがいます。

クエリ:名前が「Rafael」で、年齢が40〜50歳のユーザーを取得します

  • Linq2Objectsによる:users.Where(p=>p。Name=="Rafael" && p.Age> = 40 && p.Age <= 50).ToArray();

より良いパフォーマンスを備えた代替の実装はありますか?(読み取り専用スレッドセーフ)

(マルチインデックスユーザー配列)

パフォーマンスをテストしました。1000kユーザーの場合、30〜50ミリ秒かかります。重要ではないようですが、重要です。1秒間に50件のリクエストを受け取ることができるからです。

dharnitskiのソリューションを使用します。0msかかります。:)

しかし、それを透過的にするコードフレームワークはありますか?

public  class   FastArray<T> 
4

1 に答える 1

4

データが準備されていない場合、完全なデータセットスキャンなしでは希望する結果を得ることができません。時間が重要でない場合は事前にデータを準備し、短い応答時間が必要な場合はソートされたデータを処理します。

データベースの世界では、これに類似しています。

10万レコードのテーブルがあります。誰かが、主キーではなくデータをフィルタリングする「where」句を使用してSelectクエリを実行したいと考えています。インデックスが実装されていない限り、実行プランでは常に低速の「テーブルスキャン」操作になります。

を使用してインデックス作成を実装するコードのサンプルILookup<TKey, TValue>

//not sorted array of users - raw data
User[] originalUsers;
//Prepare data in advance (create one index). 
//Field with the best distribution should be used as key
ILookup<string, User> preparedUsers = originalUsers.ToLookup(u => u.Name, u => u);


//run this code when you need subset 
//search by key is optimized by .NET class 
//"where" clause works with small set of data
preparedUsers["Rafael"].Where(p=> p.Age>=40 && p.Age<=50).ToArray();

このコードはデータベースインデックスほど強力ではありませんが(たとえば、サブストリングをサポートしていません)、アイデアを示しています。

于 2012-06-08T00:25:04.433 に答える