深さ優先探索は、ファイルシステムを検索するための恐ろしい方法です。実際には、ルートに非常に近いディレクトリの下にある可能性のあるファイルは、DFSが別の深さによって気を散らされるため、DFSで検出されるまでに長い時間がかかる可能性があります。ディレクトリの無関係な階層。
ただし、そのリソース要件は非常に優れています。開いたままにしておく必要のあるファイルハンドルの数は、サイズではなく、階層の深さにのみ比例します。
幅優先探索は明らかな解決策です-それは非常に高速です。
(前回の測定では、システムのDFSとほぼ同じ時間で約8秒かかりました。)
しかし、BFSには独自の問題があります。BFSでは、非常に多くの、場合によっては数百万のディレクトリハンドルを開いたままにしておく必要があります。(私のシステムでは、ハンドル数は約100,000で、途方もなく高いです。簡単にそれ以上になる可能性があります。)
これにより、いくつかの問題が発生します。
非常に多くのハンドルを開いたままにしておくと、メモリ(とにかく比較的安価)だけでなく、仮想ファイルシステム内のファイル(ネットワーク、マウントされたディレクトリなど)へのハンドルや、場合によっては他の制限されたカーネルなど、他の多くの種類のリソースが消費されます。レベルのリソース。
また、ユーザーにとって他の実際的な問題も引き起こします。たとえば、開いたままになっている仮想ディレクトリは閉じられなくなります。これは、たとえば、ユーザーがプログラムを閉じたり、デバイスを取り出したり、ある種の外部接続を閉じたりできない可能性があることを意味します。このアプローチでは、あらゆる種類の問題が発生する可能性があります。
反復深化のように見えるかもしれませんが、それが解決策です。
問題?実際には非常に遅いです。問題は、大きなディレクトリ(WindowsのWinSxSなど)が、必要がない場合でも、深度レベルごとに
再列挙されることです。前回これを試したとき、反復深化は私のシステムのDFSよりも約15倍遅くなりました。したがって、8秒の検索には約120秒かかりましたが、これは許容できません。
もちろん、開くべきではないディレクトリを追跡しようとすると(おそらく、もう開く必要がないことに気付いたため)、BFSで発生したすべてのリソースの問題を明らかにすることで、最初に反復深化を使用する目的が無効になります。 。
したがって、質問は非常に単純です。
なじみのないファイルシステムを検索している場合、速度と使いやすさの許容可能なバランスを実現するには、どのように進めればよいでしょうか。BFSよりも良い選択肢はありますか?