internship at pfi

57
Sotaro Karasawa (sotarok) Yet Another PHP Programmer Internship at Preferred Infrastructure

Upload: sotaro-karasawa

Post on 21-May-2015

2.762 views

Category:

Technology


0 download

DESCRIPTION

インターンシップ最終成果報告会@PFI

TRANSCRIPT

Page 1: Internship at PFI

Sotaro Karasawa (sotarok)Yet Another PHP Programmer

InternshipatPreferred Infrastructure

Page 2: Internship at PFI

Copyright © sotarok @ PFI.

Agenda• 目標• 転置インデックス用ライブラリ libkorakuen

– 中間発表までのおさらい– 新しいアプローチでの実装– 実装にあたってのポイント– 英語Wikipedia のインデックス作成– デモ– libkorakuenのこれから

• インターンを終えて

Page 3: Internship at PFI

Copyright © sotarok @ PFI.

目標• 転置インデックス用のライブラリをつくる!

– メモリに乗り切らないような大規模で使える– インデックスファイルを圧縮する– Sedueで使える

Page 4: Internship at PFI

転置インデックス用ライブラリlibkorakuen

Page 5: Internship at PFI

Copyright © sotarok @ PFI.

中間発表までのアプローチ

⽂書

libkorakuenTemporaryIndex On Memory

Index Encoder

Index

読み込み

Page 6: Internship at PFI

Copyright © sotarok @ PFI.

中間発表までのアプローチ

⽂書

libkorakuenTemporaryIndex On Memory

Index Encoder

Index

読み込み

Keyword: Document (Pos, Pos, ...), Document (Pos , ...), ...Keyword: Document (Pos, Pos, ...), Document (Pos , ...), ...Keyword: Document (Pos, Pos, ...), Document (Pos , ...), ......

Page 7: Internship at PFI

Copyright © sotarok @ PFI.

中間発表までのアプローチ

⽂書

libkorakuenTemporaryIndex On Memory

Index Encoder

Index

読み込み

Page 8: Internship at PFI

Copyright © sotarok @ PFI.

中間発表までのアプローチ

⽂書

libkorakuenTemporaryIndex On Memory

Index Encoder

Index

書き出す

Page 9: Internship at PFI

Copyright © sotarok @ PFI.

中間発表までのアプローチ

⽂書

libkorakuenTemporaryIndex On Memory

Index Encoder

Index

読み込み

書き出す

Page 10: Internship at PFI

Copyright © sotarok @ PFI.

中間発表までのアプローチ

⽂書

libkorakuenTemporaryIndex On Memory

Index Encoder

Index

Page 11: Internship at PFI

Copyright © sotarok @ PFI.

中間発表までのおさらい• 中間発表時

– ⼀応インデックスは作れた– 10万⽂書程度で実験もOK

ところが...

Page 12: Internship at PFI

Copyright © sotarok @ PFI.

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

Page 13: Internship at PFI

Copyright © sotarok @ PFI.

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

IndexKeyword2......

IndexKeyword

Page 14: Internship at PFI

Copyright © sotarok @ PFI.

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

...IndexIndex

Keyword2...

Index2Keyword

Page 15: Internship at PFI

Copyright © sotarok @ PFI.

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

Index2

...IndexIndex

Keyword2...

Index3Keyword

Page 16: Internship at PFI

Copyright © sotarok @ PFI.

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

• メモリから⼀時インデックスに書き出すたびにTokyo Cabinet上での「Append」が発⽣

• 巨大なデータを扱うと途中から⼊らなくなる

Index2

...IndexIndex

Keyword2...

Index3Keyword

Page 17: Internship at PFI

Copyright © sotarok @ PFI.

アプローチを考え直す

英語のWikipediaすべてが目標

英語のWikipediaを最低目標とし可能な限りスケールする設計

Page 18: Internship at PFI

Copyright © sotarok @ PFI.

新しいアプローチ• MapReduce的な考え⽅!• 途中でインデックスを作成せずにすべて読み込む• それぞれのファイルをソートする• 2つずつマージする• インデックスを作成する

Page 19: Internship at PFI

読み込む

Page 20: Internship at PFI

Copyright © sotarok @ PFI.

何も考えずにとりあえず読み込む

41210130248251221

011

036

posdoc idkeyword id

... ......

⽂書

libkorakuen

On Memory

Page 21: Internship at PFI

Copyright © sotarok @ PFI.

何も考えずにとりあえず読み込む

41210130248251221

011

036

posdoc idkeyword id

... ......

⽂書

libkorakuen

On Memory

Page 22: Internship at PFI

Copyright © sotarok @ PFI.

何も考えずにとりあえず読み込む

41210130248251221

011

036

posdoc idkeyword id

... ......

⽂書

libkorakuen

On Memory

Page 23: Internship at PFI

Copyright © sotarok @ PFI.

何も考えずにとりあえず読み込む

41210130248251221

011

036

posdoc idkeyword id

... ......

⽂書

libkorakuen

On Memory

Page 24: Internship at PFI

Copyright © sotarok @ PFI.

何も考えずにとりあえず読み込む

41210130248251221

011

036

posdoc idkeyword id

... ......

⽂書

libkorakuen

On Memory

Page 25: Internship at PFI

Copyright © sotarok @ PFI.

何も考えずにとりあえず読み込む

41210130248251221

011

036

posdoc idkeyword id

... ......

⽂書

libkorakuen

On Memory

⼀時ファイル

Page 26: Internship at PFI

Copyright © sotarok @ PFI.

分割された⼀時ファイル

4121013024825

1221

011

036

posdoc idkeyword id

... ......

⽂書

libkorakuen

⼀時ファイル

Page 27: Internship at PFI

ソートする

Page 28: Internship at PFI

Copyright © sotarok @ PFI.

ソートする

1221

4121013024825

011

036

posdoc idkeyword id

... ......

⽂書

On Memory

⼀時ファイル

libkorakuen

Page 29: Internship at PFI

Copyright © sotarok @ PFI.

ソートする

12214121013024825

011

036

posdoc idkeyword id

... ......

⽂書

On Memory

⼀時ファイル

libkorakuen

ソート済み⼀時ファイル

Page 30: Internship at PFI

マージする

Page 31: Internship at PFI

マージする

⽂書

libkorakuen

ソート済み⼀時ファイル

1

ソート済み⼀時ファイル

2

ソート済み⼀時ファイル

n...

マージ済み⼀時ファイル

1

Page 32: Internship at PFI

マージする

⽂書

libkorakuen

ソート済み⼀時ファイル

3

ソート済み⼀時ファイル

4

ソート済み⼀時ファイル

n...

マージ済み⼀時ファイル

2

マージ済み⼀時ファイル

1

Page 33: Internship at PFI

マージする

⽂書

libkorakuen

ソート済み⼀時ファイル

n-1

ソート済み⼀時ファイル

n

...マージ済み

⼀時ファイル2

マージ済み⼀時ファイル

1

マージ済み⼀時ファイル

2/n

Page 34: Internship at PFI

マージする

⽂書

libkorakuen

ひとつの大きなマージ済み

⼀時ファイル

Page 35: Internship at PFI

インデックス作成

Page 36: Internship at PFI

インデックス作成

⽂書

ひとつの大きなマージ済み

⼀時ファイル

Keyword Document (Pos, Pos, ...),Document (Pos , ...), ...Document (Pos , ...), ...Document (Pos , ...), ...

Keyword Document (Pos, Pos, ...),Document (Pos , ...), ...Document (Pos , ...), ...Document (Pos , ...), ...

Keyword Document (Pos, Pos, ...),Document (Pos , ...), ...Document (Pos , ...), ...Document (Pos , ...), ...

libkorakuen

Page 37: Internship at PFI

インデックス作成

⽂書

ひとつの大きなマージ済み

⼀時ファイル

Keyword Document (Pos, Pos, ...),Document (Pos , ...), ...Document (Pos , ...), ...Document (Pos , ...), ...

Keyword Document (Pos, Pos, ...),Document (Pos , ...), ...Document (Pos , ...), ...Document (Pos , ...), ...

Keyword Document (Pos, Pos, ...),Document (Pos , ...), ...Document (Pos , ...), ...Document (Pos , ...), ...

libkorakuen

pos0

pos122

pos456

Page 38: Internship at PFI

インデックス作成

⽂書

インデックス!

libkorakuen

Page 39: Internship at PFI

ポイント

Page 40: Internship at PFI

Copyright © sotarok @ PFI.

ポイント• 簡潔で,Sedueにも使いやすそうなAPI

– ⽂書数分だけ Addして– BuildIndexするだけ– Search で探す

Page 41: Internship at PFI

Copyright © sotarok @ PFI.

Add• 単語の分割やポジションはライブラリの外で• ⽂書ID(外部で管理してるものでOK)

– 自動的に内部でIDを振りなおす• 単語とその出現場所のリスト(vector)

– 単語IDも⽣成

Page 42: Internship at PFI

Copyright © sotarok @ PFI.

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

Page 43: Internship at PFI

Copyright © sotarok @ PFI.

圧縮• 中間発表からかわらず,Variable Byte Code

Page 44: Internship at PFI

Copyright © sotarok @ PFI.

Variable Byte Code

3: 00000000 00000000 00000000 00000011

3: 10000011

Page 45: Internship at PFI

Copyright © sotarok @ PFI.

Variable Byte Code

3: 00000000 00000000 00000000 00000011

3: 10000011

��������

����Byte��������������������?

����

��������

Page 46: Internship at PFI

Copyright © sotarok @ PFI.

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

Page 47: Internship at PFI

Copyright © sotarok @ PFI.

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

• 作成時間: 1:30:37.09• 作成後インデックス:6.1 GB

– ドキュメントIDを振りなおしているおかげでほとんどがものすごく⼩さい整数→圧縮率良

Page 48: Internship at PFI

デモ

Page 49: Internship at PFI

Copyright © sotarok @ PFI.

その他のポイント• テストケースかきました

– まだ GetKeywordID, GetDocIDしかない

Page 50: Internship at PFI

Copyright © sotarok @ PFI.

その他のポイント2• ライブラリ検証用プログラム (デモしたやつ)

– ii_search– ii_check

Page 51: Internship at PFI

これからの libkorakuen

Page 52: Internship at PFI

Copyright © sotarok @ PFI.

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

Page 53: Internship at PFI

インターンを終えて

Page 54: Internship at PFI

Copyright © sotarok @ PFI.

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

Page 55: Internship at PFI

Copyright © sotarok @ PFI.

やりたかったのにできなかった• Sedueへの組み込み• PHP 関連のライブラリ

– これは趣味でもできそうなので近いうち実装する

Page 56: Internship at PFI

Copyright © sotarok @ PFI.

その他さまざまな思い• 技術的なことに関して

– アルゴリズムやデータ構造を考えてプログラムを組むこと

– ライブラリを利用するか自分で実装するか– 実装の背景にある理論や研究

• 技術者として– 自分の知らない分野のことを勉強するのは楽しい– PHP とか怖くないという自信(何

• まとまらないので近⽇中にブログに書きます!

Page 57: Internship at PFI

ありがとうございましたお世話になりました!