我有一个非常庞大的词典,里面的内容,它看起来像:
(在字典中不包括标题)如何加快在一个巨大的字典搜索
(code) (names)
------------------------------
910235487 Diabetes, tumors, sugar sick, .....
我有超过15万线这种对在字典中。
用户输入是关键字(诊断名称),我无法通过键搜索字典。
下面是代码:
var relevantIDs = this.dic.Where(ele => ele.Value.Contains(keyword)).Select(n => Convert.ToUInt64(n.Key));
字典是Dictionary<string, string>
和我必须使用字符串作为密钥的数据类型,这是因为代码可以有时含有的字符。名称列包含相关诊断名称的列表。所以我也不能改变这种数据类型。
我认为这个问题是对的每个值,我做了Contains
操作并会减慢谁处理,但我不能找到一个替代办法做下去......
这是我做过什么以找到匹配的代码。
但是,这段代码的性能很糟糕(完成这一行代码大约需要5分钟)。
有人可以帮忙吗?
更新和简单的解决方案:
我终于找到了赛季为什么搜索是如此缓慢,并通过这样做解决了这个问题:
var relevantStringIDs = this.dic.Where(ele => ele.Value.Contains(keyword)).Tolist();
var relevantUlongIDs = relevantStringIDs.Select(n => Convert.ToUInt64(n.Key)).Tolist();
之所以说它是慢是this.dic.Where(ele => ele.Value.Contains(keyword))
,每执行一次查询的第二部分就会执行(这是IEnumberable<T>
的功能,我忘记了它的用语(可能是延迟执行))。因此,我使用ToList()
将延迟查询转换为内存中的具体列表,以便在将字符串转换为ulongs
时可以重新使用结果,而不是为每次转换再次执行查询。
如果您在此解释中发现错误,请纠正我。
顺便说一句,虽然这可能不是最好的解决方案,但改变后的代码的性能很安静。代码的第一个声明只需169 ms,对我来说足够快。
嗨,大家好,请不要downvote我的问题没有告诉我的原因。我查了其他类似的问题,但没有一个真正解决了我的问题。 – Franva
如果您的代码可以包含字符,您将很难将它们全部转换为Int64 ... –
术语是“[延期执行]”(http://msdn.microsoft.com/en-us/library /bb943859.aspx)”。然而,在Where和Select之间发布一个额外的ToList在这种情况下不太可能有助于提高性能。如果你多次迭代最终结果(我假设你是),那么你主要从* final *'ToList'中受益。尝试从'dic.Where(...)。ToList()。选择(...)。ToList()'到'dic.Where(...)。Select。(...)。ToList )' - 你会发现性能几乎没有变化。 – Douglas