巨大的内存数据集.需要一个快速搜索的整数Id属性

本文关键字:一个 搜索 整数 属性 Id 数据集 内存 巨大 | 更新日期: 2023-09-27 18:05:18

我有一个巨大的内存中已定义类型的普通CLR对象集(大约100K条记录)。这个类型有公共属性int Id {get;设置;}。什么是最好的。net结构来包含这个庞大的数据集,以便通过其Id快速访问任何项目?更具体地说,应该在循环中操作这组数据,以便根据Id查找项,因此应该尽可能快地完成搜索。搜索结果可能如下所示:

// Find by id
var entity = entities.First(e => e.Id == id)
集合和列表等基于枚举的结构将遍历数据的每个元素,直到找到查找元素。有什么替代方法吗?我相信应该有一种方法,使排序数组的搜索像索引搜索数据库。

感谢

测试结果:仅供参考:字典不仅仅是快,它是无与伦比的。我的小测试显示,性能从大约3000+ ms(在IEnumerable上调用First())到0(在Dictionary上调用[index])!

巨大的内存数据集.需要一个快速搜索的整数Id属性

我就去用 Dictionary<TKey, TValue> :

var index = new System.Collections.Generic.Dictionary<int, T>();

其中T是您想要访问的对象类型。

这是作为哈希表实现的,即。通过计算键的哈希值(这通常是一个非常快速的操作)并使用该哈希值作为表的索引来查找项。这可能有点过于简化了,但是对于字典来说,你在字典中存储了多少条目几乎无关紧要。访问时间应大致保持不变。

  • 添加条目,执行index.Add(entity.Id, entity);

  • 检查是否有收集项,index.ContainsKey(id) .

  • 按ID检索项目,index[id]

Dictionary<TKey, TValue>,其中TKeyint, TValueYourEntity

例子
var dictionary = new Dictionary<TKey, TValue>();
dictionary.Add(obj1.Id, obj1); 
// continue 

或者如果您有一个对象集合,您可以使用查询

创建字典。
var dictionary = list.ToDictionary(obj => obj.Id, obj => obj);

备注:键值不能重复。如果您有一个非惟一的集合,则首先筛选重复项(可能在创建字典之前调用Distinct())。另外,如果要在集合上循环以手动创建字典,请在尝试Add操作之前检查ContainsKey方法。

通常内存查找最好使用Dictionary:

System.Collections.Generic.Dictionary

根据给出的信息,HashTable可能是最快的。Dictionary类将为您提供易用性与性能之间的最佳权衡。如果你真的需要最大的性能,我会尝试下面所有的类。基于内存使用、插入速度、搜索速度,它们的执行都不同:

  • ListDictionary
  • HashTable
  • 字典
  • SortedDictionary
  • ConcurrentDictionary最后
除了性能之外,您可能还会关注多线程访问。这两个集合提供线程安全性:
  • HashTable(多个读,只允许一个线程写)
  • ConcurrentDictionary最后

这取决于你的数据。如果你拥有的对象数量有上限,并且没有太多的缺失对象(意味着你不能拥有超过X个对象,你通常有接近X个对象),那么常规数组是最快的。

T[] itemList = new T[MAX_ITEMS];

但是,如果这两个条件都不成立,那么字典可能是最好的选择。

Dictionary<int, T> itemList = new Dictionary<int, T>();