すべてを再帰的に削除したいです.in
。時間がかかり、利用可能なコアが多いので、このプロセスを並列化したいと思います。 ~からこのスレッドxargs
、使用またはmake
並列化できるようですfind
。このfindアプリケーションを並列化できますか?
これは私の現在のシリアルコマンドです。
find . -name "*.in" -type f -delete
答え1
これを(デフォルト)-delete
に置き換えてGNU並列にパイピングすると、トリックを実行できます。-print
find . -name '*.in' -type f | parallel rm --
これにより、コアごとに1つのジョブが実行されます。代わりに並列操作を使用してください-j N
。N
削除はおそらくCPU制限よりもI / Oが多いので、これが順次削除より速く実行されるかどうかはわかりませんが、テストしてみるのは興味深いでしょう。
(2つのコマンドがまったく同じではないため、「ほとんど」と言います。たとえば、parallel
入力パスの一部に改行文字が含まれている場合、このバージョンは正しい操作を行いません。)
答え2
(またはより正確な表現は+(または))find . -name "*.in" -type f -delete
に置き換えることが常に良い選択ではないかもしれません。find . -name '*.in' -type f | parallel rm --
find -print0
parallel -0
xargs -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