gpt4 book ai didi

c# - 如何在庞大的词典中加快搜索速度

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:07:49 25 4
gpt4 key购买 nike

我有一个非常大的字典,里面的内容是这样的:
(字典中不包含标题)

(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减慢 who 进程的操作,但我找不到替代方法...

这就是我为了找到匹配的代码所做的。
但是这段代码的性能很糟糕(完成这一行代码大约需要 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 毫秒,这对我来说已经足够快了。

最佳答案

你做错了。当您知道而不是值时,字典允许高效查找。

修复性能的一种简单方法是构建一个反向字典,模仿您的内容的全文索引:

var dic = new Dictionary<string, string>();
dic.Add("910235487", "Diabetes, tumors, sugar sick");
dic.Add("120391052", "Fever, diabetes");

char[] delimiters = new char[] { ' ', ',' };

var wordCodes =
from kvp in dic
from word in kvp.Value.Split(delimiters, StringSplitOptions.RemoveEmptyEntries)
let code = long.Parse(kvp.Key)
select new { Word = word, Code = code };

var fullTextIndex =
wordCodes.ToLookup(wc => wc.Word, wc => wc.Code, StringComparer.OrdinalIgnoreCase);

long[] test1 = fullTextIndex["sugar"].ToArray(); // Gives 910235487
long[] test2 = fullTextIndex["diabetes"].ToArray(); // Gives 910235487, 120391052

全文索引的构建需要很长时间;但是,这是一次性成本,将通过后续查找节省的时间来摊销。

关于c# - 如何在庞大的词典中加快搜索速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17665961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com