Rabbit Slide Show

百万件くらいのデータの扱い方

Description

件数が多いデータの扱い方について。 キーワードは『荷物運び』です。 ※いわゆるビッグデータの話ではありません(Hadoopなどは千兆単位のデータを扱う)

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

Other slides