Perl  で圧縮 株式会社はてな / {Shibuya, Kansai}.pm 伊藤直也
アジェンダ <ul><li>モチベーション </li></ul><ul><li>データ圧縮の概念 </li></ul><ul><ul><li>データの最適な表現を用いる手法 </li></ul></ul><ul><ul><li>データの冗長性を...
モチベーション
圧縮のモチベーション <ul><li>データ圧縮の用途 </li></ul><ul><ul><li>データ保存容量を小さく </li></ul></ul><ul><ul><li>データ読み出し速度を速く </li></ul></ul>
ディスクリードと圧縮 <ul><li>HDD vs  メモリ ->  10 -6  ~ 10 -9   の差 </li></ul><ul><ul><li>HDD 上のデータのシーク ・・・ ディスクの回転待ち、ヘッドの移動に  ms </li>...
復号処理と負荷 <ul><li>圧縮して保存 -> CPU処理と I/O のオーバーラップでスループット向上 </li></ul><ul><ul><li>圧縮済みデータの読み出し ・・・ I/O 負荷 </li></ul></ul><ul><u...
データ圧縮の概念
前提 :  可逆圧縮と不可逆圧縮 <ul><li>今回扱うのは可逆 (lossless) 圧縮 </li></ul><ul><ul><li>主にテキスト圧縮の話 </li></ul></ul>
データ圧縮の基本 <ul><li>データの最適な表現を用いる </li></ul><ul><ul><li>例: モールス信号 </li></ul></ul><ul><ul><ul><li>E : ・ </li></ul></ul></ul><u...
データの最適な表現を 用いる手法
頻出するものを短く、そうでないものは長く <ul><li>晴、曇、雨、雪を符号化 </li></ul><ul><ul><li>2ビット の固定長符号 </li></ul></ul><ul><ul><ul><li>晴 00, 曇 01, 雨, 1...
データ圧縮  =  モデル化  +  符号化 入力 記号列 モデル化 符号化 記号の 出現確率 符号語列
先ほどの天気の例 <ul><li>モデル化 </li></ul><ul><ul><li>晴  >  曇  >  雨  >  雪 の順に起こりやすい -> 確率分布 </li></ul></ul><ul><li>符号化 </li></ul><ul...
モデル化と符号化の手法 <ul><li>モデル化 </li></ul><ul><ul><li>最も単純なもの: 無記憶情報源モデル </li></ul></ul><ul><ul><ul><li>記号列の文脈を考慮しないモデル </li></ul...
簡単なテキスト圧縮 <ul><li>無記憶情報源モデル + ハフマン符号 </li></ul><ul><li>Perl での実装 </li></ul><ul><ul><li>テキストの各単語の出現回数を調べる </li></ul></ul><u...
より進んだテキスト圧縮の例 <ul><li>PPM +  適応型算術符号 </li></ul><ul><ul><li>PPM で過去の文脈から次の記号の出現確率を予測 </li></ul></ul><ul><ul><li>予測した確率分布を適応...
データの冗長性を なくす手法
データの冗長性をなくす手法 <ul><li>連長圧縮 (Run-Length) </li></ul><ul><li>Front Coding </li></ul><ul><li>LZ符号 ・・・ 辞書ベースの手法 </li></ul>
辞書ベースの手法 <ul><li>入力記号列を辞書中の単語へのポインタで置き換える </li></ul><ul><ul><li>前に出現したデータを利用した圧縮 </li></ul></ul><ul><ul><li>例 : ababbababa...
LZ77 <ul><li>以前に出現したデータ(文脈)から最長一致部分列を探し、ポインタに置き換え </li></ul><ul><li>LZSS </li></ul><ul><ul><li>LZ77の変種、スライディングウィンドウ </li><...
LZ78 <ul><li>データから辞書を作成し、辞書中のポインタに置き換え </li></ul><ul><ul><li>辞書は静的に作るのではなく、適応的に作る </li></ul></ul><ul><ul><ul><li>符号化しながら辞書...
その他の話題
整数の単調増加列の圧縮 <ul><li>単調増加する整数列 </li></ul><ul><ul><li>例: [ 1, 5, 7, 8, 10, 15, 23, 100, .... ] </li></ul></ul><ul><ul><li>検索...
Variable Byte  符号 <ul><li>Continuationビット + 7ビット </li></ul><ul><ul><li>127以下の整数は1バイトで表現できる </li></ul></ul><ul><ul><li>大きい整...
エントロピーと圧縮限界 <ul><li>エントロピー (平均情報量) </li></ul><ul><ul><li>H 0  = -ΣP(x) log P(x) </li></ul></ul><ul><ul><ul><li>無記憶情報源 (zer...
圧縮アルゴリズムのトレードオフ <ul><li>トレードオフ </li></ul><ul><ul><li>圧縮率 </li></ul></ul><ul><ul><li>符号化速度 </li></ul></ul><ul><ul><li>復号速度 ...
Perl  で圧縮
CPAN  の圧縮ライブラリ <ul><li>Compress::*  系 </li></ul><ul><ul><li>符号化まで含めて一気通貫で、汎用的 </li></ul></ul><ul><li>代表的 ( で使えそう ) な実装 </l...
Compress::Zlib <ul><li>zlib  の  Perl  バインディング </li></ul><ul><ul><li>deflate  アルゴリズム </li></ul></ul><ul><ul><ul><li>LZSS + ...
Compress::Bzip2 <ul><li>libbzip2  の  Perl  バインディング </li></ul><ul><ul><li>Block Sorting +  ハフマン符号 </li></ul></ul><ul><li>高い...
Compress::LZMA::Simple <ul><li>liblzma </li></ul><ul><ul><li>LZMA  ・・・  7-Zip  などで利用されている圧縮アルゴリズム </li></ul></ul><ul><ul><...
Compress::LZO <ul><li>LZO ライブラリのバインディング </li></ul><ul><ul><li>LZO  ・・・  LZ77 ベース、圧縮率を犠牲に符号化 / 復号 ( 特に復号 ) 速度を高速化 </li></ul...
Compress::PPMd <ul><li>Dmitry Shkarin 氏の PPMd ライブラリのバインディング </li></ul><ul><ul><li>Prediction by Partial Matching </li></ul...
符号化の部品 <ul><li>ハフマン符号 -> Algorithm::Huffman </li></ul><ul><li>Range Coder </li></ul>
Algorithm::Huffman <ul><li>ハフマン符号の実装 </li></ul><ul><li>モデル化を自前でやりたい場合などに </li></ul>
Range Coder <ul><li>算術符号の特許フリー(と言われている)且つ高速な実装 </li></ul><ul><ul><li>1記号あたり1ビット以下の符号長を実現 </li></ul></ul><ul><ul><li>適応型圧縮ア...
整数列の圧縮 <ul><li>pack('w*', @values) </li></ul><ul><ul><li>可変長バイト符号相当 </li></ul></ul><ul><ul><li>Array::Gap  ・・・ 差分取って VB 符号...
個人的な見解 <ul><li>汎用的なテキスト圧縮には zlib や LZMA </li></ul><ul><ul><li>符号化、復号化共に要速度 ・・・ zlib </li></ul></ul><ul><ul><li>符号化は遅くても良い ...
まとめ <ul><li>データ圧縮の概論と、 Perl  での  TIPS  を紹介した </li></ul><ul><li>I/O  スループット向上のためにもデータ圧縮は重要 </li></ul><ul><li>CPAN  の  Compr...
WEB+DB PRESS Vol.52 ~ <ul><li>Recent Perl World にてデータ圧縮の話 </li></ul>
参考文献 <ul><li>Ian H. Witten, Alistair Moffat, Timothy  C. Bell &quot; Managing Gigabytes &quot;, Morgan Kaufmann, 1999 </li...
Upcoming SlideShare
Loading in …5
×

Perlで圧縮

19,490 views

Published on

YAPC::Asia 2009 での発表資料

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

No Downloads
Views
Total views
19,490
On SlideShare
0
From Embeds
0
Number of Embeds
11,615
Actions
Shares
0
Downloads
39
Comments
0
Likes
12
Embeds 0
No embeds

No notes for slide

Perlで圧縮

  1. 1. Perl で圧縮 株式会社はてな / {Shibuya, Kansai}.pm 伊藤直也
  2. 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. 3. モチベーション
  4. 4. 圧縮のモチベーション <ul><li>データ圧縮の用途 </li></ul><ul><ul><li>データ保存容量を小さく </li></ul></ul><ul><ul><li>データ読み出し速度を速く </li></ul></ul>
  5. 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. 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. 7. データ圧縮の概念
  8. 8. 前提 : 可逆圧縮と不可逆圧縮 <ul><li>今回扱うのは可逆 (lossless) 圧縮 </li></ul><ul><ul><li>主にテキスト圧縮の話 </li></ul></ul>
  9. 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. 10. データの最適な表現を 用いる手法
  11. 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. 12. データ圧縮 = モデル化 + 符号化 入力 記号列 モデル化 符号化 記号の 出現確率 符号語列
  13. 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. 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. 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. 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. 17. データの冗長性を なくす手法
  18. 18. データの冗長性をなくす手法 <ul><li>連長圧縮 (Run-Length) </li></ul><ul><li>Front Coding </li></ul><ul><li>LZ符号 ・・・ 辞書ベースの手法 </li></ul>
  19. 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. 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. 21. LZ78 <ul><li>データから辞書を作成し、辞書中のポインタに置き換え </li></ul><ul><ul><li>辞書は静的に作るのではなく、適応的に作る </li></ul></ul><ul><ul><ul><li>符号化しながら辞書を育てていく </li></ul></ul></ul>
  22. 22. その他の話題
  23. 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. 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. 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. 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. 27. Perl で圧縮
  28. 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. 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. 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. 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. 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. 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. 34. 符号化の部品 <ul><li>ハフマン符号 -> Algorithm::Huffman </li></ul><ul><li>Range Coder </li></ul>
  35. 35. Algorithm::Huffman <ul><li>ハフマン符号の実装 </li></ul><ul><li>モデル化を自前でやりたい場合などに </li></ul>
  36. 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. 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. 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. 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. 40. WEB+DB PRESS Vol.52 ~ <ul><li>Recent Perl World にてデータ圧縮の話 </li></ul>
  41. 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>

×