おそらく多数のファイルとディレクトリ (通常は数十万個まで) に関するいくつかのデータをメモリに保持する必要があります。明らかなアプローチはDictionary<string, Something>
、パスをキーとして a を使用することですが、これには 2 つの問題があります。
- ファイルの多くは共通のパスの大部分を持っているため、各ファイルのフルパスを保存するのはおそらくメモリの無駄です
- ディレクトリのすべての子孫に関するデータにすばやくアクセスできる必要があります。ディクショナリでは、これを行う唯一の方法は、各キーをテストし、指定されたパスで始まるかどうかを確認することですが、これは非常に非効率的です
この問題は、パスのセグメントを「文字」として、プレフィックス ツリー (またはtrie )を使用するための良い候補のようです。私はそれを実装しようとしましたが、プレフィックスによる検索のパフォーマンスはそれほど悪くありません (辞書よりも約 4 倍高速です) が、2 つの問題があります。
- おそらく各ノードの子のリストのオーバーヘッドが原因で、メモリ消費量は削減されません
- 構築時間は辞書よりもはるかに悪いです (コレクションを埋めるのに約 4 倍遅くなります)
それは非常に一般的な問題であるに違いないと確信しているので、私が気付いていないよく知られた解決策があるのではないでしょうか?