a person powered by ototoy blog

モヘンジョだろ!!

2006年02月24日

超巨大ディレクトリの削除 

rm /tmp/rm_progress;

for k in 1 2 3 4 5 6 7 8 9 a b c d e f ;

do for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f;

do for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f;

do echo $i$j$k >> /tmp/rm_progress;

idprio 31 rm -f ./cache_*$k$j$i;

done; done; done

手違いで、1ディレクトリの中に350万個ほどキャッシュファイルができちゃったんだけど、それくらい大量のファイルを消すとなるとディレクトリスキャンや実際のunlink()処理をするだけでもシステムに深刻なパフォーマンスの問題が出て来る(システムタイムが110%とかになって、他のタスクに全然実行時間がまわらない)ので、こんな感じのコマンドでポチポチ消している。丸二日使って1/8くらい進んだかと。

このコマンドは、キャッシュファイル名の末尾がmd5()の結果なので必ず0-9かa-fになることを利用して、4096段階に分けて消しつつ、進行状況をファイルに書き出すというもの。

まあ、googleに聞いても全然ひっかかんなかったし、何かの役に立つかと思って。csh系列では動かなくてshとかbash用しかもidprioってFreeBSD依存かも。

...この日記を書いてから実質12日間かかってやっと終りそうな感じ。長い道のりだったなぁ。Linuxとかでもこういう事故って起こってる気がするんだけど、皆どうしてるんだろう。すげー謎。PEAR::CacheLiteとか使ってたら結構な数起こってると思うのだが。

あと、一旦大きくなったディレクトリ(今回のディレクトリファイルのサイズは実に267,376,128バイトだった)が二度と縮小できない今の実装は*BSDでもLinuxでも同様に良くないと思った。改良しやすそうなんだけど、手がついてないのは何故なんだろう。

| Posted By nt 投稿日: 2006年2月24日 14時20分 更新日: 2006年3月8日 1時58分

コメント

ftpのソフトで消したりするおいら。
by ひろゆき - 2006年3月8日 16時31分
ftpのクライアントソフトも同じ原理(ディレクトリスキャン+unlink())で消してるはずだから、100万ファイルとかあったら相当の時間がかかるはずだけど、もしかして素早く消せるの?
by nt - 2006年3月9日 20時55分
name:
comment:
【コメントに関する注意事項】
記事と全く関連性のないコメント(例:宣伝目的のコメントスパムなど)は、オーナーの判断により削除される場合があります。 - レコミュニ会員としてコメントする

トラックバック