Your SlideShare is downloading. ×
0
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Perlで圧縮
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Perlで圧縮

17,870

Published on

YAPC::Asia 2009 での発表資料

YAPC::Asia 2009 での発表資料

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

No Downloads
Views
Total Views
17,870
On Slideshare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
39
Comments
0
Likes
11
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Perl で圧縮 株式会社はてな / {Shibuya, Kansai}.pm 伊藤直也
  • 2. アジェンダ <ul><li>モチベーション </li></ul><ul><li>データ圧縮の概念 </li></ul><ul><ul><li>データの最適な表現を用いる手法 </li></ul></ul><ul><ul><li>データの冗長性をなくす手法 </li></ul></ul><ul><ul><li>そのほかの話題 </li></ul></ul><ul><li>Perl でデータ圧縮 </li></ul><ul><ul><li>Compress::* 系モジュール </li></ul></ul><ul><ul><li>符号化のモジュール </li></ul></ul><ul><ul><li>整数列の圧縮 </li></ul></ul><ul><li>まとめ </li></ul>
  • 3. モチベーション
  • 4. 圧縮のモチベーション <ul><li>データ圧縮の用途 </li></ul><ul><ul><li>データ保存容量を小さく </li></ul></ul><ul><ul><li>データ読み出し速度を速く </li></ul></ul>
  • 5. ディスクリードと圧縮 <ul><li>HDD vs メモリ -> 10 -6 ~ 10 -9 の差 </li></ul><ul><ul><li>HDD 上のデータのシーク ・・・ ディスクの回転待ち、ヘッドの移動に ms </li></ul></ul><ul><li>∴ ディスクシーク回数を最小化したい </li></ul><ul><ul><li>OS ( カーネル ) </li></ul></ul><ul><ul><ul><li>ブロック単位での読み出し </li></ul></ul></ul><ul><ul><ul><li>連続したデータは近い場所に保存 </li></ul></ul></ul><ul><ul><li>アプリケーション </li></ul></ul><ul><ul><ul><li>B+ 木など最適なデータ構造の選択 </li></ul></ul></ul><ul><ul><ul><li>圧縮して保存 -> 消費ブロック数を減らす </li></ul></ul></ul>
  • 6. 復号処理と負荷 <ul><li>圧縮して保存 -> CPU処理と I/O のオーバーラップでスループット向上 </li></ul><ul><ul><li>圧縮済みデータの読み出し ・・・ I/O 負荷 </li></ul></ul><ul><ul><li>圧縮されたデータの展開 ・・・ CPU 負荷 </li></ul></ul><ul><li>データが小さい ・・・ キャッシュに載りやすい </li></ul>
  • 7. データ圧縮の概念
  • 8. 前提 : 可逆圧縮と不可逆圧縮 <ul><li>今回扱うのは可逆 (lossless) 圧縮 </li></ul><ul><ul><li>主にテキスト圧縮の話 </li></ul></ul>
  • 9. データ圧縮の基本 <ul><li>データの最適な表現を用いる </li></ul><ul><ul><li>例: モールス信号 </li></ul></ul><ul><ul><ul><li>E : ・ </li></ul></ul></ul><ul><ul><ul><li>A: ・ ー </li></ul></ul></ul><ul><ul><ul><li>Q: ー ー ・ー </li></ul></ul></ul><ul><li>データの冗長性をなくす </li></ul><ul><ul><li>例: 連長圧縮法 (Run-Length) </li></ul></ul><ul><ul><ul><li>aaaaaa bbbbbbbb c d aaaa </li></ul></ul></ul><ul><ul><ul><li>-> a6 b8 c1 d1 a4 </li></ul></ul></ul>
  • 10. データの最適な表現を 用いる手法
  • 11. 頻出するものを短く、そうでないものは長く <ul><li>晴、曇、雨、雪を符号化 </li></ul><ul><ul><li>2ビット の固定長符号 </li></ul></ul><ul><ul><ul><li>晴 00, 曇 01, 雨, 10, 雪 11 </li></ul></ul></ul><ul><ul><ul><ul><li>晴 晴 晴 晴 曇 晴 雨 曇 晴 晴 晴 雪 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>00 00 00 00 01 00 10 01 00 00 00 11 -> 24 ビット </li></ul></ul></ul></ul><ul><ul><li>可変長符号 </li></ul></ul><ul><ul><ul><li>晴 1, 曇 00, 雨 010, 雪 011 </li></ul></ul></ul><ul><ul><ul><ul><li>晴 晴 晴 晴 曇 晴 雨 曇 晴 晴 晴 雪 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>1 1 1 1 00 1 010 00 1 1 1 011 -> 18 ビット </li></ul></ul></ul></ul>
  • 12. データ圧縮 = モデル化 + 符号化 入力 記号列 モデル化 符号化 記号の 出現確率 符号語列
  • 13. 先ほどの天気の例 <ul><li>モデル化 </li></ul><ul><ul><li>晴 > 曇 > 雨 > 雪 の順に起こりやすい -> 確率分布 </li></ul></ul><ul><li>符号化 </li></ul><ul><ul><li>確率分布に合わせて晴 1, 曇 00, 雨 010, 雪 011 という最適な符号語を割り当てる ( ハフマン符号 ) </li></ul></ul><ul><ul><ul><li>接頭符号 (Prefix Code) ・・・ 全ての符号語が他の符号語の接頭語にもなっていない </li></ul></ul></ul><ul><ul><ul><ul><li>1 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>00 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>010 </li></ul></ul></ul></ul><ul><ul><ul><ul><li>011 </li></ul></ul></ul></ul>
  • 14. モデル化と符号化の手法 <ul><li>モデル化 </li></ul><ul><ul><li>最も単純なもの: 無記憶情報源モデル </li></ul></ul><ul><ul><ul><li>記号列の文脈を考慮しないモデル </li></ul></ul></ul><ul><ul><ul><li>例: aaa bb c -> a 3/6, b 2/6, c 1/6 </li></ul></ul></ul><ul><ul><li>高度なもの </li></ul></ul><ul><ul><ul><li>有限文脈モデル、有限状態モデル </li></ul></ul></ul><ul><ul><ul><li>PPM、Block Sorting、Dynamic Markov Chain </li></ul></ul></ul><ul><li>代表的な符号化手法 </li></ul><ul><ul><li>ハフマン符号 </li></ul></ul><ul><ul><li>算術符号、Range Coder </li></ul></ul>
  • 15. 簡単なテキスト圧縮 <ul><li>無記憶情報源モデル + ハフマン符号 </li></ul><ul><li>Perl での実装 </li></ul><ul><ul><li>テキストの各単語の出現回数を調べる </li></ul></ul><ul><ul><ul><li>文脈は考慮しない </li></ul></ul></ul><ul><ul><li>Algorithm::Huffman で符号化 </li></ul></ul>
  • 16. より進んだテキスト圧縮の例 <ul><li>PPM + 適応型算術符号 </li></ul><ul><ul><li>PPM で過去の文脈から次の記号の出現確率を予測 </li></ul></ul><ul><ul><li>予測した確率分布を適応型の算術符号 ( 適応型 Range Coder など ) で符号化 </li></ul></ul><ul><li>BWT + MTF + Run-Length + 符号化 </li></ul><ul><ul><li>Block sorting(BWT) で文脈を揃える </li></ul></ul><ul><ul><li>Move To Front + Run-Length で偏りのある整数列に変換 </li></ul></ul><ul><ul><li>ハフマン符号もしくは Range Coder で符号化 </li></ul></ul><ul><ul><li>bzip2 がこの方式 </li></ul></ul>
  • 17. データの冗長性を なくす手法
  • 18. データの冗長性をなくす手法 <ul><li>連長圧縮 (Run-Length) </li></ul><ul><li>Front Coding </li></ul><ul><li>LZ符号 ・・・ 辞書ベースの手法 </li></ul>
  • 19. 辞書ベースの手法 <ul><li>入力記号列を辞書中の単語へのポインタで置き換える </li></ul><ul><ul><li>前に出現したデータを利用した圧縮 </li></ul></ul><ul><ul><li>例 : ababbababaa -> ab(1,2)(2,3)(6,3)(10,1) </li></ul></ul><ul><li>LZ 符号 </li></ul><ul><ul><li>LZ77, LZ78 </li></ul></ul><ul><ul><li>比較的単純な処理でそれなりの圧縮率を実現 -> 実用性が高い。実用的な圧縮ソフトウェアの多くは LZ 法がベース </li></ul></ul>
  • 20. LZ77 <ul><li>以前に出現したデータ(文脈)から最長一致部分列を探し、ポインタに置き換え </li></ul><ul><li>LZSS </li></ul><ul><ul><li>LZ77の変種、スライディングウィンドウ </li></ul></ul><ul><ul><ul><li>全文脈から最長一致を探すのは大変 -> 固定長のバッファの中から最長一致を探す </li></ul></ul></ul>
  • 21. LZ78 <ul><li>データから辞書を作成し、辞書中のポインタに置き換え </li></ul><ul><ul><li>辞書は静的に作るのではなく、適応的に作る </li></ul></ul><ul><ul><ul><li>符号化しながら辞書を育てていく </li></ul></ul></ul>
  • 22. その他の話題
  • 23. 整数の単調増加列の圧縮 <ul><li>単調増加する整数列 </li></ul><ul><ul><li>例: [ 1, 5, 7, 8, 10, 15, 23, 100, .... ] </li></ul></ul><ul><ul><li>検索エンジンの転置インデックスなど </li></ul></ul><ul><li>差分を取る -> 可変長符号で符号化 </li></ul><ul><ul><li>例: [ 1, 4, 2, 1, 2, 5, 8, 77, ...] </li></ul></ul><ul><ul><ul><li>小さい数字が出やすい </li></ul></ul></ul><ul><ul><li>可変長符号 ・・・ VB符号、γ符号、δ符号 </li></ul></ul><ul><ul><ul><li>小さい数字ほど短く符号化できる手法 </li></ul></ul></ul>
  • 24. Variable Byte 符号 <ul><li>Continuationビット + 7ビット </li></ul><ul><ul><li>127以下の整数は1バイトで表現できる </li></ul></ul><ul><ul><li>大きい整数でも複数バイトあれば表現できる </li></ul></ul><ul><li>perl の pack('w*', @values) が VB 符号相当 </li></ul>
  • 25. エントロピーと圧縮限界 <ul><li>エントロピー (平均情報量) </li></ul><ul><ul><li>H 0 = -ΣP(x) log P(x) </li></ul></ul><ul><ul><ul><li>無記憶情報源 (zero-order) </li></ul></ul></ul><ul><ul><ul><li>高次のエントロピー ・・・ H 1 , H 2 ... </li></ul></ul></ul><ul><li>平均符号長をエントロピー以下には圧縮できない </li></ul><ul><ul><li>エントロピー以下まで圧縮した場合、情報の歪みなしで復元することができない </li></ul></ul>
  • 26. 圧縮アルゴリズムのトレードオフ <ul><li>トレードオフ </li></ul><ul><ul><li>圧縮率 </li></ul></ul><ul><ul><li>符号化速度 </li></ul></ul><ul><ul><li>復号速度 </li></ul></ul><ul><ul><li>要求メモリ </li></ul></ul><ul><li>一般的に圧縮率を少し犠牲にすると、速度やメモリ量が大きく改善する </li></ul>
  • 27. Perl で圧縮
  • 28. CPAN の圧縮ライブラリ <ul><li>Compress::* 系 </li></ul><ul><ul><li>符号化まで含めて一気通貫で、汎用的 </li></ul></ul><ul><li>代表的 ( で使えそう ) な実装 </li></ul><ul><ul><li>Compress::Zlib </li></ul></ul><ul><ul><li>Compress::Bzip2 </li></ul></ul><ul><ul><li>Compress::LZMA::Simple </li></ul></ul><ul><ul><li>Compress::LZO </li></ul></ul><ul><ul><li>Compress::PPMd </li></ul></ul>
  • 29. Compress::Zlib <ul><li>zlib の Perl バインディング </li></ul><ul><ul><li>deflate アルゴリズム </li></ul></ul><ul><ul><ul><li>LZSS + ハフマン符号 </li></ul></ul></ul><ul><ul><ul><li>zlib, gzip </li></ul></ul></ul><ul><li>小さいオーバーヘッドゆえに高速、そこそこの圧縮率 </li></ul><ul><ul><li>広範囲で利用されている </li></ul></ul><ul><ul><li>符号化、復号化共に高速 </li></ul></ul><ul><ul><li>枯れている ・・・「とりあえず zlib で」 </li></ul></ul><ul><ul><li>短いテキストには向かない </li></ul></ul>
  • 30. Compress::Bzip2 <ul><li>libbzip2 の Perl バインディング </li></ul><ul><ul><li>Block Sorting + ハフマン符号 </li></ul></ul><ul><li>高い圧縮率、そこそこ高速な復号 </li></ul><ul><ul><li>符号化が zlib に比べて遅い (Block sorting が支配的 ) </li></ul></ul><ul><ul><li>復号はそこそこ高速 , zlib より遅い </li></ul></ul><ul><ul><li>処理時間を少し犠牲にしつつも、 zlib より高い圧縮率が欲しいとき </li></ul></ul><ul><ul><li>やはり、短いテキストには向かない </li></ul></ul>
  • 31. Compress::LZMA::Simple <ul><li>liblzma </li></ul><ul><ul><li>LZMA ・・・ 7-Zip などで利用されている圧縮アルゴリズム </li></ul></ul><ul><ul><ul><li>Repeated Offsets, Binary Range Coder, 状態コンテキストベースのモデル化 , 最適マッチング </li></ul></ul></ul><ul><li>符号化が低速な代わりに非常に高い圧縮率と高速な復号 </li></ul><ul><ul><li>符号化はかなり遅い </li></ul></ul><ul><ul><li>圧縮率がかなり高い (bzip2 よりも高性能 ) </li></ul></ul><ul><ul><li>復号は bzip2 よりも高速、 zlib よりは低速 </li></ul></ul><ul><ul><li>符号化は遅くても全く構わない、という場合に </li></ul></ul><ul><ul><ul><li>例 : 静的アーカイブの配布 </li></ul></ul></ul>
  • 32. Compress::LZO <ul><li>LZO ライブラリのバインディング </li></ul><ul><ul><li>LZO ・・・ LZ77 ベース、圧縮率を犠牲に符号化 / 復号 ( 特に復号 ) 速度を高速化 </li></ul></ul><ul><li>圧縮率は高くないが、非常に高速 (wikipedia) </li></ul><ul><ul><li>符号化は deflate と同程度 </li></ul></ul><ul><ul><li>復号は &quot;very fast&quot; </li></ul></ul><ul><ul><ul><li>&quot; in non-trivial cases able to exceed the speed of a straight memory-to-memory copy due to the reduced memory-reads. &quot; </li></ul></ul></ul><ul><ul><li>頻繁に更新されるデータや、復号のオーバーヘッドを極力小さく抑えたい時に </li></ul></ul>
  • 33. Compress::PPMd <ul><li>Dmitry Shkarin 氏の PPMd ライブラリのバインディング </li></ul><ul><ul><li>Prediction by Partial Matching </li></ul></ul><ul><ul><ul><li>以前の文脈から次の記号の出現確率を予測するモデル化手法 </li></ul></ul></ul>
  • 34. 符号化の部品 <ul><li>ハフマン符号 -> Algorithm::Huffman </li></ul><ul><li>Range Coder </li></ul>
  • 35. Algorithm::Huffman <ul><li>ハフマン符号の実装 </li></ul><ul><li>モデル化を自前でやりたい場合などに </li></ul>
  • 36. Range Coder <ul><li>算術符号の特許フリー(と言われている)且つ高速な実装 </li></ul><ul><ul><li>1記号あたり1ビット以下の符号長を実現 </li></ul></ul><ul><ul><li>適応型圧縮アルゴリズムにも利用できる </li></ul></ul><ul><li>CPAN には Range Coder の実装なし </li></ul><ul><ul><li>拙作 Pure Perl Range Coder </li></ul></ul><ul><ul><ul><li>http://github.com/naoya/perl-RangeCoder/tree/master </li></ul></ul></ul>
  • 37. 整数列の圧縮 <ul><li>pack('w*', @values) </li></ul><ul><ul><li>可変長バイト符号相当 </li></ul></ul><ul><ul><li>Array::Gap ・・・ 差分取って VB 符号 </li></ul></ul><ul><ul><ul><li>http://d.hatena.ne.jp/naoya/20080906/1220685978 </li></ul></ul></ul><ul><li>γ 符号 , δ 符号 , ゴロム / ライス符号 etc </li></ul><ul><ul><li>ビットレベルの整数符号化 </li></ul></ul><ul><ul><li>組み込み、 CPAN の実装はないので自前で </li></ul></ul>
  • 38. 個人的な見解 <ul><li>汎用的なテキスト圧縮には zlib や LZMA </li></ul><ul><ul><li>符号化、復号化共に要速度 ・・・ zlib </li></ul></ul><ul><ul><li>符号化は遅くても良い ・・・ LZMA も候補 </li></ul></ul><ul><li>整数列の圧縮は速度重視なら pack 、圧縮率重視なら δ 符号やゴロム符号を実装 </li></ul><ul><li>昨年の Pathtraq の事例 (※) のような場合は自前でデータの特性に合った実装 </li></ul>※ http://www.slideshare.net/kazuho/yapcasia-2008-tokyo-pathtraq-building-a-computationcentric-web-service
  • 39. まとめ <ul><li>データ圧縮の概論と、 Perl での TIPS を紹介した </li></ul><ul><li>I/O スループット向上のためにもデータ圧縮は重要 </li></ul><ul><li>CPAN の Compress:: モジュールで汎用的な圧縮が可能 </li></ul><ul><ul><li>アプリケーションの性質に応じて使い分けると良い </li></ul></ul><ul><li>場合によっては圧縮ルーチンを自前で実装すると良いことも </li></ul>
  • 40. WEB+DB PRESS Vol.52 ~ <ul><li>Recent Perl World にてデータ圧縮の話 </li></ul>
  • 41. 参考文献 <ul><li>Ian H. Witten, Alistair Moffat, Timothy C. Bell &quot; Managing Gigabytes &quot;, Morgan Kaufmann, 1999 </li></ul><ul><li>植松友彦 &quot; 文書データ圧縮アルゴリズム入門 &quot;, CQ 出版 , 1994 </li></ul><ul><li>岡野原大輔 , 小川秀明 , 藤本健 &quot; よくわかる最新 データ圧縮技術の基本と仕組み &quot;, 秀和システム , 2003 </li></ul>

×