find を使用した再帰削除の並列化

find を使用した再帰削除の並列化

すべてを再帰的に削除したいです.in。時間がかかり、利用可能なコアが多いので、このプロセスを並列化したいと思います。 ~からこのスレッドxargs、使用またはmake並列化できるようですfind。このfindアプリケーションを並列化できますか?

これは私の現在のシリアルコマンドです。

find . -name "*.in" -type f -delete

答え1

これを(デフォルト)-deleteに置き換えてGNU並列にパイピングすると、トリックを実行できます。-print

find . -name '*.in' -type f | parallel rm --

これにより、コアごとに1つのジョブが実行されます。代わりに並列操作を使用してください-j NN

削除はおそらくCPU制限よりもI / Oが多いので、これが順次削除より速く実行されるかどうかはわかりませんが、テストしてみるのは興味深いでしょう。

(2つのコマンドがまったく同じではないため、「ほとんど」と言います。たとえば、parallel入力パスの一部に改行文字が含まれている場合、このバージョンは正しい操作を行いません。)

答え2

(またはより正確な表現は+(または))find . -name "*.in" -type f -deleteに置き換えることが常に良い選択ではないかもしれません。find . -name '*.in' -type f | parallel rm --find -print0parallel -0xargs -r0 -P10 -n1

$ parallel -X touch {}.testfile ::: {00000..99999}
$ ls | wc -l
100000
$ time find . -name '*.testfile' -type f | parallel -j10 rm --

real    20m58.470s
user    11m30.553s
sys     58m15.265s
$ parallel -X touch {}.testfile ::: {00000..99999}
$ ls | wc -l
100000
$ time find . -name '*.testfile' -type f -delete

real    3m57.199s
user    0m0.973s
sys     0m37.356s

ここに見られるように順次バージョンははるかに高速です。。他の人が正しく指摘したように、I/O 境界は次のとおりです。これ限界要因(非常に低いCPU、ディスク、メモリ使用率)、並列化はわずかなオーバーヘッドのみを追加します(簡単な場合)。


並列化オプションを調整すると、類似またはより良い結果が得られます。始める1つの方法はオプションを説明することです。ここ

findこれは少しだまされていました(ここに文書はありませんが、名前を知っていると仮定します)。しかし、まだ遅い順番に:

$ time seq -f 'rm %04g.testfile' 00000 99999 | parallel --pipe sh

real    8m9.800s
user    2m54.668s
sys     0m57.027s

関連情報