SlideShare une entreprise Scribd logo
1  sur  25
Télécharger pour lire hors ligne
百万件くらいの
 データの扱い方
 Unix大量ゴミファイル事件簿

                        Masafumi Yokoyama

百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿     Powered by Rabbit 2.0.7
Rabbitについて

     プレゼンテーションツール
      実装: Ruby/GTK+
          動作: PC-UNIX/Win/Mac
          文章とデザインの分離
             バージョン管理しやすい


百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿   Powered by Rabbit 2.0.7
テーマ



          件数が多いデータの扱い方




百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿     Powered by Rabbit 2.0.7
キーワードは『荷物運び』




百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿   Powered by Rabbit 2.0.7
一度に運ぶ量
          大量
             持てない

          少量
             夜になっても終わらない

          適量
             明るいうちに終わる

百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿   Powered by Rabbit 2.0.7
考え方


          件数が多いデータは、適量に分け
          て処理する
             まずは適量を見極める




百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿     Powered by Rabbit 2.0.7
具体例


          大量ファイルの削除
             Unixサーバー
             GUIが使えない




百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿     Powered by Rabbit 2.0.7
問題



          ディレクトリ内の.gomiファイルを
          全て削除したい




百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿        Powered by Rabbit 2.0.7
状況分析
     ls(dir)コマンドの末端




百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿   Powered by Rabbit 2.0.7
分析結果

        名前が長いファイルが大量にある
             ファイル名: 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
(1) 普通に削除


        $ ls | wc -l #ファイル数を数える
        10000
        $ rm *.gomi
        /bin/rm: cannot execute [引数リストが長すぎます]
        $ ls | wc -l
        10000




百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿         Powered by Rabbit 2.0.7
消せな
   い!
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿   Powered by Rabbit 2.0.7
原因



          一度にrmコマンドに渡せる引数
          には上限がある




百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿        Powered by Rabbit 2.0.7
NG
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿   Powered by Rabbit 2.0.7
(2) 1ファイルずつ削除
                            $   rm   gomi...gomi_0000.gomi
                            $   rm   gomi...gomi_0001.gomi
                            $   rm   gomi...gomi_0002.gomi
                            $   rm   gomi...gomi_0003.gomi
                            $   rm   gomi...gomi_0004.gomi
                            $   rm   gomi...gomi_0005.gomi
                            $   rm   gomi...gomi_0006.gomi
                            $   rm   gomi...gomi_0007.gomi
                            $   rm   gomi...gomi_0008.gomi
                            $   rm   gomi...gomi_0009.gomi
                            $   rm   gomi...gomi_0010.gomi
                            $   rm   gomi...gomi_0011.gomi
                            $   rm   gomi...gomi_0012.gomi
                            $   rm   gomi...gomi_0013.gomi
                            $   rm   gomi...gomi_0014.gomi
                            $   rm   gomi...gomi_0015.gomi
                            $   rm   gomi...gomi_0016.gomi
                            $   rm   gomi...gomi_0017.gomi
                            $   rm   gomi...gomi_0018.gomi
                            $   rm   gomi...gomi_0019.gomi
                            $   rm   gomi...gomi_0020


百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿                             Powered by Rabbit 2.0.7
徹夜
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿   Powered by Rabbit 2.0.7
NG
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿   Powered by Rabbit 2.0.7
(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
(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
OK!
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿   Powered by Rabbit 2.0.7
落とし穴

        以下のやり方だと、rmコマンドが一
        万回呼ばれる

        $ find . -name "*.gomi" | xargs -i rm '{}'

        $ find . -name "*.gomi" -exec rm '{}' ;



百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿              Powered by Rabbit 2.0.7
遅い
        コマンドを呼ぶ回数が多いと遅くな
        る

        $ 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
徹夜の恐れ

百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿   Powered by Rabbit 2.0.7
適量ずつ
          大量
             持てない

          少量
             夜になっても終わらない

          適量
             明るいうちに終わる

百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿   Powered by Rabbit 2.0.7
その他の例
          DBMSのトランザクション処理
             DB2では100件くらいずつコミットする
             IMPORTのcommitcountオプション

          プロセス数やスレッド数
             メモリやCPUが100%で固定されない
             程度に増やすと速い

                                   おわり
百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿   Powered by Rabbit 2.0.7

Contenu connexe

En vedette

エンジニアにMacを薦める理由
エンジニアにMacを薦める理由エンジニアにMacを薦める理由
エンジニアにMacを薦める理由
Hiroyuki Kusu
 
GPUによる多倍長整数乗算の高速化手法の提案
GPUによる多倍長整数乗算の高速化手法の提案GPUによる多倍長整数乗算の高速化手法の提案
GPUによる多倍長整数乗算の高速化手法の提案
Koji Kitano
 
SIMDで整数除算
SIMDで整数除算SIMDで整数除算
SIMDで整数除算
shobomaru
 
Xeonphiハッカソンでexpを作ってみた
Xeonphiハッカソンでexpを作ってみたXeonphiハッカソンでexpを作ってみた
Xeonphiハッカソンでexpを作ってみた
MITSUNARI Shigeo
 
Unix 基礎
Unix 基礎Unix 基礎
Unix 基礎
Sho A
 
関西ライフハック研究会×アイデアプラント
関西ライフハック研究会×アイデアプラント関西ライフハック研究会×アイデアプラント
関西ライフハック研究会×アイデアプラント
Rikie Ishii
 
Software Foundation:形式的証明と非形式的証明
Software Foundation:形式的証明と非形式的証明Software Foundation:形式的証明と非形式的証明
Software Foundation:形式的証明と非形式的証明
T T
 

En vedette (20)

【幕張読書会】Unixカーネルの設計 3(バッファキャッシュ)
【幕張読書会】Unixカーネルの設計 3(バッファキャッシュ)【幕張読書会】Unixカーネルの設計 3(バッファキャッシュ)
【幕張読書会】Unixカーネルの設計 3(バッファキャッシュ)
 
Editor縮小のススメ
Editor縮小のススメEditor縮小のススメ
Editor縮小のススメ
 
エンジニアにMacを薦める理由
エンジニアにMacを薦める理由エンジニアにMacを薦める理由
エンジニアにMacを薦める理由
 
GPUによる多倍長整数乗算の高速化手法の提案
GPUによる多倍長整数乗算の高速化手法の提案GPUによる多倍長整数乗算の高速化手法の提案
GPUによる多倍長整数乗算の高速化手法の提案
 
私がお世話になった技術書たち
私がお世話になった技術書たち私がお世話になった技術書たち
私がお世話になった技術書たち
 
UNIXことはじめ
UNIXことはじめUNIXことはじめ
UNIXことはじめ
 
SIMDで整数除算
SIMDで整数除算SIMDで整数除算
SIMDで整数除算
 
Unixコマンド入門
Unixコマンド入門Unixコマンド入門
Unixコマンド入門
 
Xeonphiハッカソンでexpを作ってみた
Xeonphiハッカソンでexpを作ってみたXeonphiハッカソンでexpを作ってみた
Xeonphiハッカソンでexpを作ってみた
 
Boost.SIMD
Boost.SIMDBoost.SIMD
Boost.SIMD
 
PFI Seminar 2010/02/18
PFI Seminar 2010/02/18PFI Seminar 2010/02/18
PFI Seminar 2010/02/18
 
Unix 基礎
Unix 基礎Unix 基礎
Unix 基礎
 
Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御
 
Unix2
Unix2Unix2
Unix2
 
ふり返りハック ~ ライフをハッキングするために
ふり返りハック ~ ライフをハッキングするためにふり返りハック ~ ライフをハッキングするために
ふり返りハック ~ ライフをハッキングするために
 
関西ライフハック研究会×アイデアプラント
関西ライフハック研究会×アイデアプラント関西ライフハック研究会×アイデアプラント
関西ライフハック研究会×アイデアプラント
 
IGDA_Sig-BoardGame_ワークショップ用資料
IGDA_Sig-BoardGame_ワークショップ用資料IGDA_Sig-BoardGame_ワークショップ用資料
IGDA_Sig-BoardGame_ワークショップ用資料
 
GTD 残業を減らす方法
GTD 残業を減らす方法GTD 残業を減らす方法
GTD 残業を減らす方法
 
Software Foundation:形式的証明と非形式的証明
Software Foundation:形式的証明と非形式的証明Software Foundation:形式的証明と非形式的証明
Software Foundation:形式的証明と非形式的証明
 
理系女子の恋愛と結婚 「東大で理系の恋愛を語ろう」
理系女子の恋愛と結婚 「東大で理系の恋愛を語ろう」理系女子の恋愛と結婚 「東大で理系の恋愛を語ろう」
理系女子の恋愛と結婚 「東大で理系の恋愛を語ろう」
 

Plus de Masafumi Yokoyama (9)

Rabbit on Sinatra
Rabbit on SinatraRabbit on Sinatra
Rabbit on Sinatra
 
コマンドプロンプト Tips
コマンドプロンプト Tipsコマンドプロンプト Tips
コマンドプロンプト Tips
 
GitHubで学ぶバージョン管理
GitHubで学ぶバージョン管理GitHubで学ぶバージョン管理
GitHubで学ぶバージョン管理
 
文字コード略歴
文字コード略歴文字コード略歴
文字コード略歴
 
Rabbit2.0!!
Rabbit2.0!!Rabbit2.0!!
Rabbit2.0!!
 
文字コード略歴
文字コード略歴文字コード略歴
文字コード略歴
 
My add Git
My add GitMy add Git
My add Git
 
日本語フォント・メイリオ
日本語フォント・メイリオ日本語フォント・メイリオ
日本語フォント・メイリオ
 
バージョン管理入門
バージョン管理入門バージョン管理入門
バージョン管理入門
 

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

  • 1. 百万件くらいの データの扱い方 Unix大量ゴミファイル事件簿 Masafumi Yokoyama 百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿 Powered by Rabbit 2.0.7
  • 2. Rabbitについて プレゼンテーションツール 実装: Ruby/GTK+ 動作: PC-UNIX/Win/Mac 文章とデザインの分離 バージョン管理しやすい 百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿 Powered by Rabbit 2.0.7
  • 3. テーマ 件数が多いデータの扱い方 百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿 Powered by Rabbit 2.0.7
  • 5. 一度に運ぶ量 大量 持てない 少量 夜になっても終わらない 適量 明るいうちに終わる 百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿 Powered by Rabbit 2.0.7
  • 6. 考え方 件数が多いデータは、適量に分け て処理する まずは適量を見極める 百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿 Powered by Rabbit 2.0.7
  • 7. 具体例 大量ファイルの削除 Unixサーバー GUIが使えない 百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿 Powered by Rabbit 2.0.7
  • 8. 問題 ディレクトリ内の.gomiファイルを 全て削除したい 百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿 Powered by Rabbit 2.0.7
  • 9. 状況分析 ls(dir)コマンドの末端 百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿 Powered by Rabbit 2.0.7
  • 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
  • 11. (1) 普通に削除 $ ls | wc -l #ファイル数を数える 10000 $ rm *.gomi /bin/rm: cannot execute [引数リストが長すぎます] $ ls | wc -l 10000 百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿 Powered by Rabbit 2.0.7
  • 12. 消せな い! 百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿 Powered by Rabbit 2.0.7
  • 13. 原因 一度にrmコマンドに渡せる引数 には上限がある 百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿 Powered by Rabbit 2.0.7
  • 15. (2) 1ファイルずつ削除 $ rm gomi...gomi_0000.gomi $ rm gomi...gomi_0001.gomi $ rm gomi...gomi_0002.gomi $ rm gomi...gomi_0003.gomi $ rm gomi...gomi_0004.gomi $ rm gomi...gomi_0005.gomi $ rm gomi...gomi_0006.gomi $ rm gomi...gomi_0007.gomi $ rm gomi...gomi_0008.gomi $ rm gomi...gomi_0009.gomi $ rm gomi...gomi_0010.gomi $ rm gomi...gomi_0011.gomi $ rm gomi...gomi_0012.gomi $ rm gomi...gomi_0013.gomi $ rm gomi...gomi_0014.gomi $ rm gomi...gomi_0015.gomi $ rm gomi...gomi_0016.gomi $ rm gomi...gomi_0017.gomi $ rm gomi...gomi_0018.gomi $ rm gomi...gomi_0019.gomi $ rm gomi...gomi_0020 百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿 Powered by Rabbit 2.0.7
  • 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
  • 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
  • 21. 落とし穴 以下のやり方だと、rmコマンドが一 万回呼ばれる $ find . -name "*.gomi" | xargs -i rm '{}' $ find . -name "*.gomi" -exec rm '{}' ; 百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿 Powered by Rabbit 2.0.7
  • 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
  • 24. 適量ずつ 大量 持てない 少量 夜になっても終わらない 適量 明るいうちに終わる 百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿 Powered by Rabbit 2.0.7
  • 25. その他の例 DBMSのトランザクション処理 DB2では100件くらいずつコミットする IMPORTのcommitcountオプション プロセス数やスレッド数 メモリやCPUが100%で固定されない 程度に増やすと速い おわり 百万件くらいのデータの扱い方 - Unix大量ゴミファイル事件簿 Powered by Rabbit 2.0.7