2012-06-07 116 views
1
public class User 
{ 
    public int Id { get; set; } 
    public int Age { get; set; } 
    public string Name { get; set; } 
} 

我有100k用戶。多字段索引對象數組

查詢:讓用戶名爲 「拉斐爾」,其年齡在40到50之間

  • 通過Linq2Objects:users.Where(P =>點名稱== 「拉斐爾」 & &頁。 Age> = 40 & & p.Age < = 50).ToArray();

有更好的性能有其他實現嗎? (只讀線程安全的)

(MultiIndexed用戶陣列)

我測試過它的性能。對於1000k用戶,需要30-50毫秒。這似乎並不重要,但它是。 因爲我可以在一秒鐘內獲得50個請求。

隨着dharnitski的解決方案。它需要0ms。 :)

但是有沒有任何代碼框架使其透明。

public class FastArray<T> 
+0

通過線程安全,你的意思是說,當你從它那裏查詢時,會有其他進程寫入你的集合? –

+0

沒有抱歉。 ReadOnly ThreadSafe。我更新了問題。 – ozz

+0

_But是否有任何代碼框架使其透明._ - 是的。它是RDBMS :) –

回答

4

如果您的數據沒有準備好,您無法在沒有完整數據集掃描的情況下獲得您想要的結果。 當時間不重要時,提前準備數據,並在需要較短的響應時間時使用分類數據。

在數據庫領域有一個類比。

有一個表有100K記錄。有人想用「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(); 

這個代碼是沒有數據庫索引一樣強大(例如,它不支持子),但它給出了這個概念。