私は非常に巨大な辞書を持っており、その中のコンテンツは次のようになります:
(ヘッダーは辞書に含まれていません)
(code) (names)
------------------------------
910235487 Diabetes, tumors, sugar sick, .....
この種のペアの辞書には 150,000 行以上あります。
ユーザー入力はキーワード(診断名)であり、辞書をキーで検索することはできません。
コードは次のとおりです。
var relevantIDs = this.dic.Where(ele => ele.Value.Contains(keyword)).Select(n => Convert.ToUInt64(n.Key));
コードDictionary<string, string>
には文字が含まれることがあるため、キーのデータ型として文字列を使用する必要があります。名前の列には、関連する診断名のリストが含まれています。したがって、このデータ型も変更できません。
問題はペアの値ごとにあると思いますContains
.whoプロセスを遅くする操作を行いましたが、別の方法が見つかりません...
これは、一致するコードを見つけるために行ったことです。
しかし、このコードのパフォーマンスはひどいものです (この 1 行のコードを完了するのに約 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 ミリ秒しかかかりません。これは私にとって十分な速さです。