Faux pas:私が以下に述べる「速い」方法は遅い方法より60倍速くはありません。30倍高速です。私は時間の間違いを非難します(午前3時は明確な思考のための私の最高の時間ではありません:)。
更新:テスト時間の要約を追加しました(下記)。
速度係数には2つの問題があるようです。
- 使用するコマンドの選択(以下の時間比較)
- ディレクトリ内の多数のファイルの性質...「大きいことは悪いこと」のようです。数値が増加するにつれて、物事は不均衡に遅くなります。
すべてのテストは100万のファイルで行われました。
(実時間、ユーザー時間、sys時間はテストスクリプトに含まれています)
テストスクリプトはpaste.ubuntu.comにあります。
#
# 1 million files
# ===============
#
# |time |new dir |Files added in ASCENDING order
# +---- +------- +-------------------------------------------------
# real 01m 33s Add files only (ASCENDING order) ...just for ref.
# real 02m 04s Add files, and make 'rm' source (ASCENDING order)
# Add files, and make 'rm' source (DESCENDING order)
# real 00m 01s Count of filenames
# real 00m 01s List of filenames, one per line
# ---- ------- ------
# real 01m 34s 'rm -rf dir'
# real 01m 33s 'rm filename' via rm1000filesPerCall (1000 files per 'rm' call)
# real 01m 40s 'rm filename' via ASCENDING algorithm (1000 files per 'rm' call)
# real 01m 46s 'rm filename' via DESCENDING algorithm (1000 files per 'rm' call)
# real 21m 14s 'rm -r dir'
# real 21m 27s 'find dir -name "hello*" -print0 | xargs -0 -n 1000 rm'
# real 21m 56s 'find dir -name "hello*" -delete'
# real 23m 09s 'find dir -name "hello*" -print0 | xargs -0 -P 0 rm'
# real 39m 44s 'rm filename' (one file per rm call) ASCENDING
# real 47m 26s 'rm filename' (one file per rm call) UNSORTED
#
最近、1,000万の空のテストファイルを作成して削除しました。名前ごとにファイルを削除すると(つまりrm filename
)、2つの異なる方法の間に大きな時間差があるという難しい方法がわかりました...
どちらの方法でも、まったく同じrm filename
コマンドを使用します。
更新:結局のところ、コマンドはまったく同じではありません...それらの1つは一度に1000個のファイル名を 'rm'に送信していました...それは、各ファイル名が書き込まれていると思ったシェルブレース展開の問題でしたそれ自体の行でフィーダーファイルに追加されましたが、実際には1行あたり1000でした。
filnamesは 'フィーダーファイル'を介してwhile read
ループに提供されます。
フィーダーファイルは次の出力ですls -1 -f
メソッドは、1つの点を除いて、すべての点で同じです。
- 遅い方法はからの直接ソートされていないフィーダファイルを使用しています
ls -1 -f
- 高速な方法は、同じソートされていないファイルのソートされたバージョンを使用しています
ここでソートが問題であるかどうか、またはソートされたフィーダーファイルがファイルが作成された順序と偶然一致しているのかどうかはわかりません(私は単純な昇順整数アルゴリズムを使用しました)
100万ファイルの場合、高速 rm filename
メソッドは低速メソッドより60倍高速です...繰り返しますが、これが「ソート」の問題なのか、舞台裏のハッシュテーブルの問題なのかはわかりません...これは単純な並べ替えの問題ではありません。なぜ新しく追加された「並べ替えられた」ファイル名のシーケンスの並べ替えられていないリストが意図的に与えられるのですか... ls -1 -f
私はここで何が起こっているのだろうと思っているので、次の1000万のファイルを削除するのに何日も(はい数日)かかりません:) ....私は「日」と言います。倍の関与のnumberOfファイルへdisproportionatly関与増加..私はのみテストしてみたので、1詳しく万人を
ところで:名前の「ソートされたリスト」を介してファイルを削除しても、実際にはより高速であるrm -rf
2倍
と:rm -r
30倍遅く、「ソートされたリスト」方式を超えました
...しかし、ここで問題を「分類」していますか?それとも、ext4が使用するストレージのハッシング(またはその他の)メソッドにもっと関連していますか?
私をかなり困惑させることは、それぞれの呼び出しがrm filename
前の呼び出しと無関係であることです。(まあ、少なくとも「bash」の観点からはそうです)
Ubuntu / bash / 'ext4' / SATA IIドライブを使用しています。
cat
するためsort
に、2番目のテストの前ではなく、1番目のテストの前に、単純なファイルから新しいファイルを作成する必要があります。
find -delete
ますか?