3

深さ優先探索は、ファイルシステムを検索するための恐ろしい方法です。実際には、ルートに非常に近いディレクトリの下にある可能性のあるファイルは、DFSが別の深さによって気を散らされるため、DFSで検出されるまでに長い時間がかかる可能性があります。ディレクトリの無関係な階層。
ただし、そのリソース要件は非常に優れています。開いたままにしておく必要のあるファイルハンドルの数は、サイズではなく、階層の深さにのみ比例します。

幅優先探索は明らかな解決策です-それは非常に高速です。
(前回の測定では、システムのDFSとほぼ同じ時間で約8秒かかりました。)

しかし、BFSには独自の問題があります。BFSでは、非常に多くの、場合によっては数百万のディレクトリハンドルを開いたままにしておく必要があります。(私のシステムでは、ハンドル数は約100,000で、途方もなく高いです。簡単にそれ以上になる可能性があります。)

これにより、いくつかの問題が発生します。

  • 非常に多くのハンドルを開いたままにしておくと、メモリ(とにかく比較的安価)だけでなく、仮想ファイルシステム内のファイル(ネットワーク、マウントされたディレクトリなど)へのハンドルや、場合によっては他の制限されたカーネルなど、他の多くの種類のリソースが消費されます。レベルのリソース。

  • また、ユーザーにとって他の実際的な問題も引き起こします。たとえば、開いたままになっている仮想ディレクトリは閉じられなくなります。これは、たとえば、ユーザーがプログラムを閉じたり、デバイスを取り出したり、ある種の外部接続を閉じたりできない可能性があることを意味します。このアプローチでは、あらゆる種類の問題が発生する可能性があります。

反復深化のように見えるかもしれませんが、それが解決策です。

問題?実際には非常に遅いです。問題は、大きなディレクトリ(WindowsのWinSxSなど)が、必要がない場合でも、深度レベルごとに
再列挙されることです。前回これを試したとき、反復深化は私のシステムのDFSよりも約15倍遅くなりました。したがって、8秒の検索には約120秒かかりましたが、これは許容できません。

もちろん、開くべきではないディレクトリを追跡しようとすると(おそらく、もう開く必要がないことに気付いたため)、BFSで発生したすべてのリソースの問題を明らかにすることで、最初に反復深化を使用する目的が無効になります。 。

したがって、質問は非常に単純です。

なじみのないファイルシステムを検索している場合、速度と使いやすさの許容可能なバランスを実現するには、どのように進めればよいでしょうか。BFSよりも良い選択肢はありますか?

4

1 に答える 1

4

ファイルがどこにあるかについてのガイダンスが本当にない場合は、できることはあまりないと思います。シークを最小限に抑え、いくつかのトリックで時間をシークするように努める必要がありますが、ファイルシステムが断片化され、それを知る方法がないため、そこで多くのことを行うのは困難です。多くのファイルシステムでは、特にインライン化されている可能性のある小さなファイルを探している場合は、サブディレクトリを検索する前にディレクトリ内のファイルを検索する方が高速です。完全なBFSでカーネルリソースを使い果たしないことも良いことです。

ファイルがどこにあるかについてのヒントしかない場合でも、それは大いに役立ちます。たとえば、ユーザーがどこかに置いて場所を忘れたファイルの場合は、ドライブのホームディレクトリ、一時ディレクトリ、ルートから始めて、妥当な再帰制限までDFSを実行します(例:6- 8は、ユーザーが通常誤って深いツリーになってしまうことはないが、自動生成された階層が深くなる可能性があるという理論に基づいて、手動で配置されたファイルまたは自動的にダウンロードされたファイルをWindowsまたはOSXマシンで見つけます。その検索が失敗した場合は、戻って前にスキップしたディープディレクトリを検索してください。ファイルが失われた場合、検索はとにかく遅くなります。そのため、ユーザーがマシンを使い続けても安全であり、あまり多くの問題を引き起こさないように、DFSにフォールバックしてください。

そして最も重要なことは、システムに何らかの検索インデックスがある場合は、それをサポートするためにさらに多くのコードを記述することを意味する場合でも、最初にそれを確認してください。

于 2012-10-11T04:25:58.793 に答える