巨大的内存数据集.需要一个快速搜索的整数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])!
我就去用 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>
,其中TKey
为int
, TValue
为YourEntity
。
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
除了性能之外,您可能还会关注多线程访问。这两个集合提供线程安全性:
这取决于你的数据。如果你拥有的对象数量有上限,并且没有太多的缺失对象(意味着你不能拥有超过X个对象,你通常有接近X个对象),那么常规数组是最快的。
T[] itemList = new T[MAX_ITEMS];
但是,如果这两个条件都不成立,那么字典可能是最好的选择。
Dictionary<int, T> itemList = new Dictionary<int, T>();