C#中的字符串列表中的高性能“包含”搜索
我有一个大约的列表。 500,000个字符串,每个约。 100个字符长。 给定搜索词,我想识别列表中包含搜索词的所有字符串。 目前,我使用Select方法(“MATCH%term%”)使用普通旧数据集执行此操作。 这在我的笔记本电脑上大约需要600毫秒。 我想让它更快,也许100-200ms。
什么是推荐的方法?
性能至关重要,因此我可以在必要时(在合理范围内)交换内存占用以获得更好的性能 一旦初始化,字符串列表就不会改变,因此计算哈希值也是一种选择。
有没有人有推荐,哪种C#数据结构最适合这项任务?
在执行快速全文搜索时,我听说过Lucene.NET的好消息。 他们已经完成了找出最快的数据结构等工作。 我建议给那个镜头。
否则,您可能会尝试这样的事情:
var matches = list.AsParallel().Where(s => s.Contains(searchTerm)).ToList();
但它可能不会让你下降到100毫秒。
trie或后缀树有助于加快速度 – 这实际上是全文搜索(通常)正在使用的。
您可以使用C#中的实现,也可以看到这个SO线程: 在C#中寻找后缀树实现?
另外正如@leppie所提到的,并行执行可能已经为您提供了所需的x3性能增益。 但话又说回来,你必须仔细测量,没有它,这是任何人的猜测。
您是否尝试将字符串加载到List
,然后使用Linq扩展Contains
方法?
var myList = new List(); //Code to load your list goes here... var searchTerm = "find this"; var match = myList.Contains(searchTerm);
你试过以下吗?
list.FindAll(x => x.Contains("YourTerm")).ToList();
出于某种原因,List.AsParallel()。Where(…)比我的PC上的list.FindAll(…)慢。
list.AsParallel().Where(x => x.Contains("YourTerm")).ToList();
希望这会帮助你。
public static bool ContainsFast(this IList list, T item) { return list.IndexOf(item) >= 0; }
基于我所做的测试, Contains
这种变化在我身边快了大约33%。
您应该尝试使用Dictionary类。 它比List快得多,因为它是一个索引搜索。
Dictionary ldapDocument = new Dictionary(); //load your list here //Sample -> ldapDocument.Add("014548787","014548787"); var match = ldapDocument.ContainsKey(stringToMatch);