2012-06-07 75 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(); 

这个代码是没有数据库索引一样强大(例如,它不支持子),但它给出了这个概念。