多字段索引对象数组

时间:2012-06-07 23:35:51

标签: c# linq-to-objects in-memory-database

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

我有100k用户。

查询:获取名称为“Rafael”且年龄介于40到50之间的用户

  • By Linq2Objects:users.Where(p => p.Name ==“Rafael”&& p.Age> = 40&& p.Age< = 50)。ToArray();

是否有更好的性能的替代实现? (只读线程安全)

(多索引用户数组)

我测试了它的性能。对于1000k用户,它需要30-50毫秒。它似乎并不重要,但确实如此。 因为我可以在一秒钟内收到50个请求。

用dharnitski的解决方案。它需要0毫秒。 :)

但是有没有任何代码框架使它透明。

public  class   FastArray<T> 

1 个答案:

答案 0 :(得分: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();

此代码没有数据库索引那么强大(例如它不支持子字符串),但它显示了这个想法。