Text
Page: 1
百万件くらいの
データの扱い方
Unix大量ゴミファイル事件簿
Masafumi Yokoyama
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 2
Rabbitについて
プレゼンテーションツール
実装: Ruby/GTK+
動作: PC-UNIX/Win/Mac
文章とデザインの分離
バージョン管理しやすい
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 3
テーマ
件数が多いデータの扱い方
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 4
キーワードは『荷物運び』
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 5
一度に運ぶ量
大量
持てない
少量
夜になっても終わらない
適量
明るいうちに終わる
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 6
考え方
件数が多いデータは、適量に分け
て処理する
まずは適量を見極める
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 7
具体例
大量ファイルの削除
Unixサーバー
GUIが使えない
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 8
問題
ディレクトリ内の.gomiファイルを
全て削除したい
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 9
状況分析
ls(dir)コマンドの末端
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 10
分析結果
名前が長いファイルが大量にある
ファイル名: 210バイト
ファイル数: 10,000
#
$
$
$
$
テストデータの作り方
cd /tmp ; mkdir gomi ; cd gomi
ruby -e '0.upto((10 ** 4) - 1) {|i| `touch #{"gomi" * 50}_#{"%04d" % i}.gomi` }'
(cd .. ; tar czf gomi.tar.gz gomi) #バックアップ
(cd .. ; tar xzf gomi.tar.gz)
#復元
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 11
(1) 普通に削除
$ ls | wc -l #ファイル数を数える
10000
$ rm *.gomi
/bin/rm: cannot execute [引数リストが長すぎます]
$ ls | wc -l
10000
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 12
消せな
い!
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 13
原因
一度にrmコマンドに渡せる引数
には上限がある
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 14
NG
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 15
(2) 1ファイルずつ削除
$
$
$
$
$
$
$
$
$
$
$
$
$
$
$
$
$
$
$
$
$
rm
rm
rm
rm
rm
rm
rm
rm
rm
rm
rm
rm
rm
rm
rm
rm
rm
rm
rm
rm
rm
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
gomi...gomi_0000.gomi
gomi...gomi_0001.gomi
gomi...gomi_0002.gomi
gomi...gomi_0003.gomi
gomi...gomi_0004.gomi
gomi...gomi_0005.gomi
gomi...gomi_0006.gomi
gomi...gomi_0007.gomi
gomi...gomi_0008.gomi
gomi...gomi_0009.gomi
gomi...gomi_0010.gomi
gomi...gomi_0011.gomi
gomi...gomi_0012.gomi
gomi...gomi_0013.gomi
gomi...gomi_0014.gomi
gomi...gomi_0015.gomi
gomi...gomi_0016.gomi
gomi...gomi_0017.gomi
gomi...gomi_0018.gomi
gomi...gomi_0019.gomi
gomi...gomi_0020
Powered by Rabbit 2.0.7
Page: 16
徹夜
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 17
NG
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 18
(3) 適量ずつ削除
$ ls | wc -l
10000
$ rm *0.gomi
$ rm *1.gomi
$ rm *2.gomi
$ rm *3.gomi
$ rm *4.gomi
$ rm *5.gomi
$ rm *6.gomi
$ rm *7.gomi
$ rm *8.gomi
$ rm *9.gomi
$ ls | wc -l
0
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 19
(3) 適量ずつ削除
$ find . -name "*.gomi" | wc -l
10000
$ find . -name "*.gomi" | xargs rm
$ find . -name "*.gomi" | wc -l
0
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 20
OK!
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 21
落とし穴
以下のやり方だと、rmコマンドが一
万回呼ばれる
$ find . -name "*.gomi" | xargs -i rm '{}'
$ find . -name "*.gomi" -exec rm '{}' \;
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 22
遅い
コマンドを呼ぶ回数が多いと遅くな
る
$ find . -name "*.gomi" | xargs rm
#=> 0.147秒
$ find . -name "*.gomi" | xargs -i rm '{}'
#=> 14.120秒
$ find . -name "*.gomi" -exec rm '{}' \;
#=> 18.512秒
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 23
徹夜の恐れ
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 24
適量ずつ
大量
持てない
少量
夜になっても終わらない
適量
明るいうちに終わる
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7
Page: 25
その他の例
DBMSのトランザクション処理
DB2では100件くらいずつコミットする
IMPORTのcommitcountオプション
プロセス数やスレッド数
メモリやCPUが100%で固定されない
程度に増やすと速い
おわり
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿
Powered by Rabbit 2.0.7