3

ディレクトリツリーをマルチスレッドで再帰的にトラバーサルするための良いアプローチを考えています。

私が今行っているのは、ルート ディレクトリの下のフォルダーを取得し、個別のスレッドで各フォルダーに対して再帰的なトラバーサルを実行することです。

これによりパフォーマンスがかなり改善されましたが、まだ「ロングテール」の問題があります。大きなフォルダーには時間がかかります。

これよりも優れたアプローチは何ですか?

これにはpythonとjavaを使用しています。

ありがとう。

編集:ファイルをメモリにロードする必要はありません。ファイルパスを処理するだけで、ファイルサイズなどのメタデータ情報を取得できます。

4

2 に答える 2

0

ディレクトリノードの深さとサイズがわからないため、これは間違ったアプローチです。知っていたとしても、ディレクトリ ツリーの反復自体は、複数のスレッドで実行しても高速化されません。やりたいことは、単一のスレッドでディレクトリを反復処理し、ファイル/ディレクトリで行っている作業をExecutorServiceに送信することです。エグゼキュータも参照してください

于 2012-08-14T13:41:07.560 に答える
0

マルチスレッドの質問に厳密に答えると、再帰で新しいスレッドをいつスピンオフするかについて、いくつかのルールを考え出すことができます。Python 風の疑似コードで観察します。

depth = 0
while true:
    subDirCount = countSubDirs()
    if subDirCount = 0:
        break
    else:
        if depth % 2 = 0:
            for dir in subDirs:
                newThread(dir)
        else:
            for dir in subDirs:
                recurse(dir)

現在、このソリューションは、スレッドセーフで発生する恐ろしい時間を処理しません。これは、おかしな非同期リターンの設定としては非常に優れています。

于 2012-08-14T14:05:10.423 に答える