C# 大型字典和子字符串查找
我有一本有500000个键的字典,我必须使用Key.contains(“Description”)进行比较。这让我的表演非常慢。是否有其他替代方法来执行更快的搜索C# 大型字典和子字符串查找,c#,search,C#,Search,我有一本有500000个键的字典,我必须使用Key.contains(“Description”)进行比较。这让我的表演非常慢。是否有其他替代方法来执行更快的搜索 我以前有过这张单子,但效果更糟。尝试在列表上使用索引,但没有显著提高性能。除了将所有可能键的所有可能子字符串存储为字典中的键(几乎可以肯定,您没有足够的内存来执行此操作)之外,除了遍历整个集合并对每个项进行检查之外,真的没有什么可做的。考虑到您正在迭代整个集合,在列表上使用字典实际上没有多大好处,至少对于这个特定的操作是这样的(您对这
我以前有过这张单子,但效果更糟。尝试在列表上使用索引,但没有显著提高性能。除了将所有可能键的所有可能子字符串存储为字典中的键(几乎可以肯定,您没有足够的内存来执行此操作)之外,除了遍历整个集合并对每个项进行检查之外,真的没有什么可做的。考虑到您正在迭代整个集合,在
列表上使用字典
实际上没有多大好处,至少对于这个特定的操作是这样的(您对这个数据执行的其他操作可能会因为它位于字典
中而受益)。他们都会很慢。你只是有一个内在的昂贵的操作,你试图执行
如果您可以通过某种方式改变您的要求,以搜索与您的搜索字符串完全相同的字符串,那么您可以使用字典的基于哈希的查找,这是非常快的,如果您可以使用StartsWith
或EndsWith
操作而不是完整的Contains
,则可以对数据进行排序并使用二进制搜索,但是使用包含
操作时,这些优化都无法实现。除了将所有可能键的所有可能子串存储为字典中的键之外(几乎可以肯定,您没有足够的内存来执行)除了遍历整个集合并对每个项进行检查之外,实际上没有什么可以做的。考虑到您正在迭代整个集合,在列表上使用字典
实际上没有多大好处,至少对于这个特定的操作是这样的(您对这个数据执行的其他操作可能会因为它位于字典
中而受益)。他们都会很慢。你只是有一个内在的昂贵的操作,你试图执行
如果您可以通过某种方式改变您的要求,以搜索与您的搜索字符串完全相同的字符串,那么您可以使用字典的基于哈希的查找,这是非常快的,如果您可以使用StartsWith
或EndsWith
操作而不是完整的Contains
操作,那么您可以对数据进行排序并使用二进制搜索,但是使用Contains
操作无法进行任何优化。,但是你为什么不自己做基准呢
大概是这样的:
var test = "Telle Carraige Sawmill Rh-ccxxH440xxx38.5Hyv-Op-rL-2008";
var matchCollection = Regex.Matches(test, "(Carraige|Sawmill)",RegexOptions.IgnoreCase);
//matchCollection.Count should be == 2
我已经读到,通过使用正则表达式,您会得到额外的开销,但为什么不自己进行基准测试呢
大概是这样的:
var test = "Telle Carraige Sawmill Rh-ccxxH440xxx38.5Hyv-Op-rL-2008";
var matchCollection = Regex.Matches(test, "(Carraige|Sawmill)",RegexOptions.IgnoreCase);
//matchCollection.Count should be == 2
如果多次执行搜索,您可能需要考虑使用只保留与预定义条件匹配的项的额外集合。
这些集合将在填充原始词典的同时填充
这可能是一个可行的解决方案,如果你的固定搜索数量有限。
< P>如果搜索被执行多次,你可能会考虑使用额外的集合,只保留与预定义条件匹配的项。
这些集合将在填充原始词典的同时填充
如果您的固定搜索数量有限,这可能是一个可行的解决方案。您是指500000还是5000000?把它写成5000000是很奇怪的。如果在列表中使用IndexOf
使它比字典更快,那么我对你的测试方法非常怀疑……你说使用Key.contains(“Description”)
进行比较是什么意思?你能发一些代码吗?只要哈希值生成良好,不管集合大小,字典查找应该非常快。@ZongZhengLi,但他没有做字典查找;他想知道密钥是否包含字符串,而不是它是否等于字符串。如果您熟悉,可以使用适用于*description*
类查询的密钥数为500K。我的意思是索引作为可索引的集合你是说500000还是5000000?把它写成5000000是很奇怪的。如果在列表中使用IndexOf
使它比字典更快,那么我对你的测试方法非常怀疑……你说使用Key.contains(“Description”)
进行比较是什么意思?你能发一些代码吗?只要哈希值生成良好,不管集合大小,字典查找应该非常快。@ZongZhengLi,但他没有做字典查找;他想知道密钥是否包含字符串,而不是它是否等于字符串。如果您熟悉,可以使用适用于*description*
类查询的密钥数为500K。我的意思是索引为可索引的集合谢谢你。我将一些集合转换为字典,并删除了linq操作,以支持使用字典进行直接查找。但这些都是平等搜索的简单例子。此操作基于“%Like%/contains”运算符。所以在这里我被卡住了。我想在这一点上,我会尝试改变需求,这样可以做一个更简单的搜索。谢谢Servy。我将一些集合转换为字典,并删除了linq操作,以支持使用字典进行直接查找。但这些都是平等搜索的简单例子。此操作基于“%Like%/contains”运算符。所以我在这里被卡住了。我想在这一点上,我会尝试改变需求,这样可以做一个简单一点的搜索。当然,还有一个替代方案可以考虑,尽管正如您所说的regex可能会导致开销。很快就会发现。从我在VS 2013中的仪器测试来看,它看起来不太好Regex.Matches
是性能杀手..当然,还有一种替代l的方法