Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 大型字典和子字符串查找_C#_Search - Fatal编程技术网

C# 大型字典和子字符串查找

C# 大型字典和子字符串查找,c#,search,C#,Search,我有一本有500000个键的字典,我必须使用Key.contains(“Description”)进行比较。这让我的表演非常慢。是否有其他替代方法来执行更快的搜索 我以前有过这张单子,但效果更糟。尝试在列表上使用索引,但没有显著提高性能。除了将所有可能键的所有可能子字符串存储为字典中的键(几乎可以肯定,您没有足够的内存来执行此操作)之外,除了遍历整个集合并对每个项进行检查之外,真的没有什么可做的。考虑到您正在迭代整个集合,在列表上使用字典实际上没有多大好处,至少对于这个特定的操作是这样的(您对这

我有一本有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的方法