私が作成しているスクリプトの一部は、rm -rf
2 つのディレクトリを完全に削除するために利用されます。
これらのディレクトリは比較的大きいため、削除にかなりの時間がかかる場合があります。
現在、ディレクトリは順番に削除されます:
rm -rf dir1
rm -rf dir2
以下の方法でバックグラウンドで同時に削除すると、もっと速くなりますか?
rm -rf dir1 &
rm -rf dir2 &
wait
もしそうなら、なぜですか?
答え1
場合によります。
削除されるファイルが同じファイル システムとハードウェア デバイス内にある場合、オペレーティング システムは物理リソースがハードウェア内で実際の操作を実行するのを待つため、いずれにしてもそれらは最終的に連続したものになります。 の各インスタンスはrm
操作をキューに入れるため、一方が終了したらもう一方が使用可能になりますが、これによって大きな改善は期待できません。
rm
2 つの異なる FS/ハードウェア デバイスにあるファイルで発生した場合、実質的に並列かつ非同期になるため、速度は 2 倍になります。
答え2
alx741 さんが言ったように、別々のファイル システム上にない限り、どちらにしても実質的なメリットは得られないと思います。700 MB のファイルでテストしてみました。これが私の考えを裏付けるテストです。複数のローカル パーティションを操作できないので、テストできません。
ここでは、1 つのコマンドとして順番に実行します。
time rm -f test.dat1 test.dat2
real 0m0.297s
user 0m0.000s
sys 0m0.295s
同時にここに
time rm -f test.dat1 &
time rm -f test.dat2 &
real 0m0.145s
user 0m0.000s
sys 0m0.144s
real 0m0.150s
user 0m0.000s
sys 0m0.150s
ここで、これらは 2 つの個別のコマンドとして再び順番に実行されます。
time rm -f test.dat1
time rm -f test.dat2
real 0m0.146s
user 0m0.000s
sys 0m0.146s
real 0m0.153s
user 0m0.000s
sys 0m0.152s
答え3
理論的には同時実行(並行実行)は可能かもしれない。もっとゆっくりオペレーティング システムが各ディレクトリをクラスター化したままにしておくことが考えられます。つまり、 の内容はdir1
互いに近い inode 番号を持ち、互いに近いデータ ブロックを使用している可能性があります。 についても同じことが当てはまりますdir2
。ただし、 の内容はdir1
の内容に近くない可能性がありますdir2
。(これは、オペレーティング システムのバージョン、ファイル システムの種類、およびディレクトリの作成履歴によって異なります。) この場合 (2 つのディレクトリが近くにない場合)、およびファイル システムが I/O ヘッドを物理的にシークする必要があるディスク (HDD) 上にある場合、同時実行では順次実行よりも多くのシーク (→ スラッシング) が必要になる可能性があります。