Internship
at
Preferred Infrastructure

Sotaro Karasawa (sotarok)
Yet Another PHP Programmer
Agenda
• 目標
• 転置インデックス用ライブラリ libkorakuen
 –   中間発表までのおさらい
 –   新しいアプローチでの実装
 –   実装にあたってのポイント
 –   英語 Wikipedia のインデックス作成
...
目標
• 転置インデックス用のライブラリをつくる!
 – メモリに乗り切らないような大規模で使える
 – インデックスファイルを圧縮する
 – Sedue で使える




                     Copyright © so...
転置インデックス用ライブラリ
libkorakuen
中間発表までのアプローチ


   ⽂書            読み込み



                   libkorakuen
 Temporary
   Index
             On Memory
        ...
中間発表までのアプローチ


   ⽂書                           読み込み



                                    libkorakuen
 Temporary
   Index...
中間発表までのアプローチ


   ⽂書            読み込み



                   libkorakuen
 Temporary
   Index
             On Memory
        ...
中間発表までのアプローチ


   ⽂書




 Temporary   書き出す         libkorakuen
   Index
                    On Memory
                    ...
中間発表までのアプローチ


   ⽂書                   読み込み




 Temporary   書き出す         libkorakuen
   Index
                    On Memo...
中間発表までのアプローチ


   ⽂書



                   libkorakuen
 Temporary
   Index
             On Memory
                        ...
中間発表までのおさらい
• 中間発表時
  – ⼀応インデックスは作れた
  – 10万⽂書程度で実験もOK



ところが...




                    Copyright © sotarok @ PFI.
問題点
• ⼀時インデックスに,Tokyo Cabinet を使っていた




                          Copyright © sotarok @ PFI.
問題点
• ⼀時インデックスに,Tokyo Cabinet を使っていた


   Keyword   Index
  Keyword2   Index
     ...      ...




                       ...
問題点
• ⼀時インデックスに,Tokyo Cabinet を使っていた


   Keyword   Index   Index2
  Keyword2   Index
     ...      ...




              ...
問題点
• ⼀時インデックスに,Tokyo Cabinet を使っていた


   Keyword   Index   Index2   Index3
  Keyword2   Index
     ...      ...




     ...
問題点
• ⼀時インデックスに,Tokyo Cabinet を使っていた


   Keyword   Index   Index2   Index3
  Keyword2   Index
     ...      ...


• メモリから...
アプローチを考え直す


  英語のWikipediaすべてが目標




  英語のWikipediaを最低目標とし
   可能な限りスケールする設計
                        Copyright © sotarok @...
新しいアプローチ
•   MapReduce 的な考え⽅!
•   途中でインデックスを作成せずにすべて読み込む
•   それぞれのファイルをソートする
•   2つずつマージする
•   インデックスを作成する




           ...
読み込む
何も考えずにとりあえず読み込む
              On Memory
               keyword id   doc id            pos
  ⽂書
                   1       ...
何も考えずにとりあえず読み込む
              On Memory
               keyword id   doc id            pos
  ⽂書
                   1       ...
何も考えずにとりあえず読み込む
              On Memory
               keyword id   doc id            pos
  ⽂書
                   1       ...
何も考えずにとりあえず読み込む
              On Memory
               keyword id   doc id            pos
  ⽂書
                   1       ...
何も考えずにとりあえず読み込む
              On Memory
               keyword id   doc id            pos
  ⽂書
                   1       ...
何も考えずにとりあえず読み込む
              On Memory
               keyword id   doc id            pos
  ⽂書
                   1       ...
分割された⼀時ファイル

  ⽂書


              keyword id   doc id   pos
                  1          1      0
libkorakuen       2     ...
ソートする
ソートする
                 On Memory
                  keyword id   doc id            pos
     ⽂書
                      1     ...
ソートする
                 On Memory
                  keyword id   doc id            pos
     ⽂書
                      1     ...
マージする
マージする

                     ソート済み    ソート済み          ソート済み
                    ⼀時ファイル   ⼀時ファイル   ...   ⼀時ファイル
 ⽂書          ...
マージする

                     ソート済み    ソート済み          ソート済み
                    ⼀時ファイル   ⼀時ファイル   ...   ⼀時ファイル
 ⽂書          ...
マージする

                     ソート済み    ソート済み
                    ⼀時ファイル   ⼀時ファイル
 ⽂書                    n-1      n




     ...
マージする

 ⽂書




libkorakuen



ひとつの大きな
  マージ済み
 ⼀時ファイル
インデックス作成
インデックス作成
              Keyword Document (Pos, Pos, ...),
                       Document (Pos , ...), ...
                ...
インデックス作成
                    Keyword Document (Pos, Pos, ...),
              pos            Document (Pos , ...), ...
    ...
インデックス作成
              インデックス!

 ⽂書




libkorakuen
ポイント
ポイント
• 簡潔で,Sedue にも使いやすそうなAPI
 – ⽂書数分だけ Addして
 – BuildIndexするだけ
 – Search で探す




                           Copyright © s...
Add
• 単語の分割やポジションはライブラリの外で
• ⽂書ID(外部で管理してるものでOK)
 – 自動的に内部でIDを振りなおす
• 単語とその出現場所のリスト(vector)
 – 単語IDも⽣成




               ...
Search
• 単語をわたす (結果を⼊れるvectorもわたす)
• その単語の出現するドキュメントとポジションが
  得られる




                      Copyright © sotarok @ PFI.
圧縮
• 中間発表からかわらず,Variable Byte Code




                             Copyright © sotarok @ PFI.
Variable Byte Code

3: 00000000 00000000 00000000 00000011

            3: 10000011




                               Cop...
Variable Byte Code

3: 00000000 00000000 00000000 00000011

              3: 10000011


       Byte
              ?


    ...
圧縮
•   ドキュメントIDのリスト
•   昇順にソートされている
•   前の⽂書との差分に変換
•   差分とった整数をエンコード




                    Copyright © sotarok @ PFI.
英語インデックスの作成
• 単語数: 約 1500 万(たぶん)
• ドキュメント: 約 300万
• 元⽂書: 8.9 GB

• 作成時間: 1:30:37.09
• 作成後インデックス:6.1 GB
 – ドキュメントIDを振りなおしてい...
デモ
その他のポイント
• テストケースかきました
 – まだ GetKeywordID, GetDocID しかない




                                    Copyright © sotarok @ PFI.
その他のポイント2
• ライブラリ検証用プログラム (デモしたやつ)
 – ii_search
 – ii_check




                      Copyright © sotarok @ PFI.
これからの libkorakuen
これからの libkorakuen
• Sedue に
• テストケースかきまくる必要性
• ソート/マージ はスレッド使えば並列作業ができ
  るはず




                     Copyright © sotarok ...
インターンを終えて
成果として
• Tokyo Dystopia を使っていては作れない大きさの
  転置インデックスが作れるライブラリが作成でき
  た




                          Copyright © sotarok @ PF...
やりたかったのにできなかった
• Sedue への組み込み
• PHP 関連のライブラリ
 – これは趣味でもできそうなので近いうち実装する




                     Copyright © sotarok @ PFI.
その他さまざまな思い
• 技術的なことに関して
 – アルゴリズムやデータ構造を考えてプログラムを
   組むこと
 – ライブラリを利用するか自分で実装するか
 – 実装の背景にある理論や研究
• 技術者として
 – 自分の知らない分野のこと...
ありがとうございました
お世話になりました!
Upcoming SlideShare
Loading in …5
×

Internship at PFI

843 views
821 views

Published on

インターン最終成果発表会@PFI

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
843
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Internship at PFI

  1. 1. Internship at Preferred Infrastructure Sotaro Karasawa (sotarok) Yet Another PHP Programmer
  2. 2. Agenda • 目標 • 転置インデックス用ライブラリ libkorakuen – 中間発表までのおさらい – 新しいアプローチでの実装 – 実装にあたってのポイント – 英語 Wikipedia のインデックス作成 – デモ – libkorakuen のこれから • インターンを終えて Copyright © sotarok @ PFI.
  3. 3. 目標 • 転置インデックス用のライブラリをつくる! – メモリに乗り切らないような大規模で使える – インデックスファイルを圧縮する – Sedue で使える Copyright © sotarok @ PFI.
  4. 4. 転置インデックス用ライブラリ libkorakuen
  5. 5. 中間発表までのアプローチ ⽂書 読み込み libkorakuen Temporary Index On Memory Encoder Index Index Copyright © sotarok @ PFI.
  6. 6. 中間発表までのアプローチ ⽂書 読み込み libkorakuen Temporary Index On Memory Encoder Index Keyword: Document (Pos, Pos, ...), Document (Pos , ...), ... Keyword: Document (Pos, Pos, ...), Document (Pos , ...), ... Index Keyword: Document (Pos, Pos, ...), Document (Pos , ...), ... ... Copyright © sotarok @ PFI.
  7. 7. 中間発表までのアプローチ ⽂書 読み込み libkorakuen Temporary Index On Memory Encoder Index Index Copyright © sotarok @ PFI.
  8. 8. 中間発表までのアプローチ ⽂書 Temporary 書き出す libkorakuen Index On Memory Encoder Index Index Copyright © sotarok @ PFI.
  9. 9. 中間発表までのアプローチ ⽂書 読み込み Temporary 書き出す libkorakuen Index On Memory Encoder Index Index Copyright © sotarok @ PFI.
  10. 10. 中間発表までのアプローチ ⽂書 libkorakuen Temporary Index On Memory Encoder Index Index Copyright © sotarok @ PFI.
  11. 11. 中間発表までのおさらい • 中間発表時 – ⼀応インデックスは作れた – 10万⽂書程度で実験もOK ところが... Copyright © sotarok @ PFI.
  12. 12. 問題点 • ⼀時インデックスに,Tokyo Cabinet を使っていた Copyright © sotarok @ PFI.
  13. 13. 問題点 • ⼀時インデックスに,Tokyo Cabinet を使っていた Keyword Index Keyword2 Index ... ... Copyright © sotarok @ PFI.
  14. 14. 問題点 • ⼀時インデックスに,Tokyo Cabinet を使っていた Keyword Index Index2 Keyword2 Index ... ... Copyright © sotarok @ PFI.
  15. 15. 問題点 • ⼀時インデックスに,Tokyo Cabinet を使っていた Keyword Index Index2 Index3 Keyword2 Index ... ... Copyright © sotarok @ PFI.
  16. 16. 問題点 • ⼀時インデックスに,Tokyo Cabinet を使っていた Keyword Index Index2 Index3 Keyword2 Index ... ... • メモリから⼀時インデックスに書き出すたびに Tokyo Cabinet上での「Append」が発⽣ • 巨大なデータを扱うと途中から⼊らなくなる Copyright © sotarok @ PFI.
  17. 17. アプローチを考え直す 英語のWikipediaすべてが目標 英語のWikipediaを最低目標とし 可能な限りスケールする設計 Copyright © sotarok @ PFI.
  18. 18. 新しいアプローチ • MapReduce 的な考え⽅! • 途中でインデックスを作成せずにすべて読み込む • それぞれのファイルをソートする • 2つずつマージする • インデックスを作成する Copyright © sotarok @ PFI.
  19. 19. 読み込む
  20. 20. 何も考えずにとりあえず読み込む On Memory keyword id doc id pos ⽂書 1 1 0 2 1 4 3 1 10 libkorakuen 4 2 0 5 2 8 1 2 12 6 3 0 ... ... ... Copyright © sotarok @ PFI.
  21. 21. 何も考えずにとりあえず読み込む On Memory keyword id doc id pos ⽂書 1 1 0 2 1 4 3 1 10 libkorakuen 4 2 0 5 2 8 1 2 12 6 3 0 ... ... ... Copyright © sotarok @ PFI.
  22. 22. 何も考えずにとりあえず読み込む On Memory keyword id doc id pos ⽂書 1 1 0 2 1 4 3 1 10 libkorakuen 4 2 0 5 2 8 1 2 12 6 3 0 ... ... ... Copyright © sotarok @ PFI.
  23. 23. 何も考えずにとりあえず読み込む On Memory keyword id doc id pos ⽂書 1 1 0 2 1 4 3 1 10 libkorakuen 4 2 0 5 2 8 1 2 12 6 3 0 ... ... ... Copyright © sotarok @ PFI.
  24. 24. 何も考えずにとりあえず読み込む On Memory keyword id doc id pos ⽂書 1 1 0 2 1 4 3 1 10 libkorakuen 4 2 0 5 2 8 1 2 12 6 3 0 ... ... ... Copyright © sotarok @ PFI.
  25. 25. 何も考えずにとりあえず読み込む On Memory keyword id doc id pos ⽂書 1 1 0 2 1 4 3 1 10 libkorakuen 4 2 0 5 2 8 1 2 12 6 3 0 ⼀時ファイル ... ... ... Copyright © sotarok @ PFI.
  26. 26. 分割された⼀時ファイル ⽂書 keyword id doc id pos 1 1 0 libkorakuen 2 1 4 3 1 10 4 2 0 5 2 8 1 2 12 ⼀時ファイル 6 3 0 ... ... ... Copyright © sotarok @ PFI.
  27. 27. ソートする
  28. 28. ソートする On Memory keyword id doc id pos ⽂書 1 1 0 2 1 4 3 1 10 libkorakuen 4 2 0 5 2 8 1 2 12 ⼀時ファイル 6 3 0 ... ... ... Copyright © sotarok @ PFI.
  29. 29. ソートする On Memory keyword id doc id pos ⽂書 1 1 0 1 2 12 2 1 4 libkorakuen 3 1 10 4 2 0 5 2 8 ⼀時ファイル 6 3 0 ... ... ... ソート済み ⼀時ファイル Copyright © sotarok @ PFI.
  30. 30. マージする
  31. 31. マージする ソート済み ソート済み ソート済み ⼀時ファイル ⼀時ファイル ... ⼀時ファイル ⽂書 1 2 n libkorakuen マージ済み ⼀時ファイル 1
  32. 32. マージする ソート済み ソート済み ソート済み ⼀時ファイル ⼀時ファイル ... ⼀時ファイル ⽂書 3 4 n libkorakuen マージ済み マージ済み ⼀時ファイル ⼀時ファイル 1 2
  33. 33. マージする ソート済み ソート済み ⼀時ファイル ⼀時ファイル ⽂書 n-1 n libkorakuen マージ済み マージ済み マージ済み ⼀時ファイル ⼀時ファイル ... ⼀時ファイル 1 2 2/n
  34. 34. マージする ⽂書 libkorakuen ひとつの大きな マージ済み ⼀時ファイル
  35. 35. インデックス作成
  36. 36. インデックス作成 Keyword Document (Pos, Pos, ...), Document (Pos , ...), ... Document (Pos , ...), ... ⽂書 Document (Pos , ...), ... Keyword Document (Pos, Pos, ...), Document (Pos , ...), ... libkorakuen Document (Pos , ...), ... Document (Pos , ...), ... Keyword Document (Pos, Pos, ...), Document (Pos , ...), ... ひとつの大きな マージ済み Document (Pos , ...), ... ⼀時ファイル Document (Pos , ...), ...
  37. 37. インデックス作成 Keyword Document (Pos, Pos, ...), pos Document (Pos , ...), ... 0 Document (Pos , ...), ... ⽂書 Document (Pos , ...), ... Keyword Document (Pos, Pos, ...), pos Document (Pos , ...), ... libkorakuen 122 Document (Pos , ...), ... Document (Pos , ...), ... Keyword Document (Pos, Pos, ...), ひとつの大きな pos Document (Pos , ...), ... マージ済み 456 Document (Pos , ...), ... ⼀時ファイル Document (Pos , ...), ...
  38. 38. インデックス作成 インデックス! ⽂書 libkorakuen
  39. 39. ポイント
  40. 40. ポイント • 簡潔で,Sedue にも使いやすそうなAPI – ⽂書数分だけ Addして – BuildIndexするだけ – Search で探す Copyright © sotarok @ PFI.
  41. 41. Add • 単語の分割やポジションはライブラリの外で • ⽂書ID(外部で管理してるものでOK) – 自動的に内部でIDを振りなおす • 単語とその出現場所のリスト(vector) – 単語IDも⽣成 Copyright © sotarok @ PFI.
  42. 42. Search • 単語をわたす (結果を⼊れるvectorもわたす) • その単語の出現するドキュメントとポジションが 得られる Copyright © sotarok @ PFI.
  43. 43. 圧縮 • 中間発表からかわらず,Variable Byte Code Copyright © sotarok @ PFI.
  44. 44. Variable Byte Code 3: 00000000 00000000 00000000 00000011 3: 10000011 Copyright © sotarok @ PFI.
  45. 45. Variable Byte Code 3: 00000000 00000000 00000000 00000011 3: 10000011 Byte ? Copyright © sotarok @ PFI.
  46. 46. 圧縮 • ドキュメントIDのリスト • 昇順にソートされている • 前の⽂書との差分に変換 • 差分とった整数をエンコード Copyright © sotarok @ PFI.
  47. 47. 英語インデックスの作成 • 単語数: 約 1500 万(たぶん) • ドキュメント: 約 300万 • 元⽂書: 8.9 GB • 作成時間: 1:30:37.09 • 作成後インデックス:6.1 GB – ドキュメントIDを振りなおしているおかげでほとん どがものすごく⼩さい整数 → 圧縮率良 Copyright © sotarok @ PFI.
  48. 48. デモ
  49. 49. その他のポイント • テストケースかきました – まだ GetKeywordID, GetDocID しかない Copyright © sotarok @ PFI.
  50. 50. その他のポイント2 • ライブラリ検証用プログラム (デモしたやつ) – ii_search – ii_check Copyright © sotarok @ PFI.
  51. 51. これからの libkorakuen
  52. 52. これからの libkorakuen • Sedue に • テストケースかきまくる必要性 • ソート/マージ はスレッド使えば並列作業ができ るはず Copyright © sotarok @ PFI.
  53. 53. インターンを終えて
  54. 54. 成果として • Tokyo Dystopia を使っていては作れない大きさの 転置インデックスが作れるライブラリが作成でき た Copyright © sotarok @ PFI.
  55. 55. やりたかったのにできなかった • Sedue への組み込み • PHP 関連のライブラリ – これは趣味でもできそうなので近いうち実装する Copyright © sotarok @ PFI.
  56. 56. その他さまざまな思い • 技術的なことに関して – アルゴリズムやデータ構造を考えてプログラムを 組むこと – ライブラリを利用するか自分で実装するか – 実装の背景にある理論や研究 • 技術者として – 自分の知らない分野のことを勉強するのは楽しい – PHP とか怖くないという自信(何 • まとまらないので近⽇中にブログに書きます! Copyright © sotarok @ PFI.
  57. 57. ありがとうございました お世話になりました!

×