そのデータ、ちょっと重くない?

データ圧縮と、意味を失わずに効率的に情報を表現する方法を探る。

  • #data compression
  • #redundancy removal
  • #dictionary coding
  • #run-length encoding

「このファイル、メールで送れない」

陸が困った顔をしていた。画像ファイルが50MBもある。

「圧縮すればいい」葵が提案した。

「圧縮?潰すってこと?」陸が首を傾げた。

由紀が笑った。「データを小さくする技術ですよ」

葵がノートを開いた。「圧縮の基本は、冗長性の除去だ」

「冗長性…同じ情報の繰り返し?」

「そう。例えば、『AAAAAABBBBCCCC』という文字列」

陸が見た。「AとBとCが繰り返してる」

「これをランレングス符号化すると、『6A4B4C』になる。14文字が6文字に」

由紀が興奮した。「半分以下!」

「これが圧縮の基本原理。パターンを見つけて、短い表現に置き換える」

葵がホワイトボードに別の例を描いた。

「辞書符号化。よく出る単語やフレーズを、短いコードで表す」

「『情報理論』を毎回書かずに、『IT』と略すみたいな?」

「まさに。LZ77とかLZWとか、有名な圧縮アルゴリズムは、この原理を使う」

陸が考えた。「じゃあ、パターンがないデータは?」

「圧縮できない」葵がきっぱり言った。「ランダムなデータは、エントロピーが高いから、圧縮の余地がない」

由紀が尋ねた。「画像はどうやって圧縮するんですか?」

「いくつか方法がある。まず、隣接ピクセルは似た色が多い。この相関を利用する」

葵がスマホで画像を見せた。空の写真。

「青いピクセルが並んでる。『青、青、青…』と繰り返さず、『青を1000個』と表現できる」

「なるほど」

「さらに、人間の目は細かい変化に鈍感。高周波成分を削っても、見た目は変わらない」

陸が反応した。「それがJPEG?」

「正解。JPEGは周波数変換して、重要でない成分を捨てる」

葵が補足した。「DCT、離散コサイン変換を使う。画像を周波数成分に分解して、高周波を削る」

由紀がノートに書いた。「可逆圧縮はパターン探し、非可逆圧縮は情報を削る」

「良いまとめだ」

陸が疑問を持った。「じゃあ、圧縮されたファイルを、さらに圧縮できる?」

「一般的には無理」葵が説明した。「すでに冗長性が除去されてるから。圧縮済みファイルは、ほぼランダムに見える」

「へえ、圧縮にも限界がある」

「エントロピーが限界。それ以上は減らせない」

由紀がふと思いついた。「暗号化されたファイルも圧縮できない?」

「鋭い!良い暗号は、ランダムに見える。だから圧縮できない」

葵が続けた。「逆に、圧縮できるデータは、パターンがある。セキュリティ的には弱点になることもある」

陸が真剣になった。「圧縮って、情報を見抜く技術でもあるんだ」

「そう。データの構造を理解しないと、効率的に圧縮できない」

葵が陸のファイルを見た。「この画像、同じ色の領域が多い。PNG形式で保存し直せば、かなり小さくなる」

「試してみる!」

数分後、ファイルサイズが10MBになった。

「すごい!5分の1だ」

「画像の性質に合った圧縮形式を選ぶのが重要」葵が言った。

由紀が微笑んだ。「データの性格を理解して、最適な方法を選ぶ。人間関係みたいですね」

「面白い比喩だ」葵が認めた。「圧縮も、相手を理解するところから始まる」

陸がファイルを送信した。「伝わった!ありがとう、葵先輩」

「重いデータも、理解すれば軽くなる」葵が静かに言った。

情報理論は、いつも実用的だった。