7

私のWebアプリケーションでは、PHPスクリプトを使用してページをレンダリングし、それらから静的HTMLファイルを生成します。静的HTMLは、パフォーマンスを高速化するためにユーザーに提供されます。HTMLファイルは最終的に古くなり、削除する必要があります。

私は、立ち退きスクリプトを書く2つの方法の間で議論しています。

1つ目は、次のような単一の検索コマンドを使用することです。

find /var/www/cache -type f -mmin +10 -exec rm \{} \;

2番目の形式は、xargsを介してパイプすることです。

find /var/www/cache -type f -mmin +10 -print0 | xargs -0 rm

rm最初のフォームは、見つかったファイルごとに呼び出しますが、2番目のフォームは、すべてのファイル名を1つに送信するだけですrm(ただし、ファイルリストは非常に長い場合があります)。

どちらの形式が速いでしょうか?

私の場合、キャッシュディレクトリはいくつかのWebサーバー間で共有されているため、この問題が問題になる場合は、これはすべてNFSを介して行われます。

4

4 に答える 4

20

xargs バージョンは、投稿した -exec バージョンよりも多くのファイルで劇的に高速です。これは、削除するファイルごとに 1 回rm実行されるためです。xargs は、できるだけ多くのファイルを 1 つのコマンドにまとめます。rm

数万または数十万のファイルがある場合、1 分以内と 1 時間の大部分の差になる可能性があります。

「\;」の代わりに「+」でコマンドを終了することにより、-exec で同じ動作を得ることができます。このオプションは、新しいバージョンの でのみ使用できますfind

次の 2 つはほぼ同等です。

find . -print0 | xargs -0 rm
find . -exec rm \{} +

xargs一部の作業は並列化できるため、このバージョンはマルチプロセッサ システムでわずかに (数パーセント) 高速に実行されることに注意してください。これは、多くの計算が必要な場合に特に当てはまります。

于 2009-11-15T01:38:26.023 に答える
6

ファイル名ごとにプロセスを生成していないため、xargs バージョンの方が若干高速になると思います。でも、実際にやってみるとそんなに差があるとは驚きです。xargs が rm の呼び出しごとに送信する長いリストが心配な場合は、xargs で -l を使用して、使用するトークンの数を制限できます。ただし、xargs はコマンドラインの最長の長さを認識しており、それを超えることはありません。

于 2009-06-11T12:48:43.937 に答える
2

find コマンドには -delete オプションが組み込まれていますが、これも役立つのではないでしょうか? http://lists.freebsd.org/pipermail/freebsd-questions/2004-July/051768.html

于 2011-03-01T01:52:53.123 に答える