EnsekiTT Blog

EnsekiTTが書くブログです。

Pythonによるインメモリでのデータ圧縮の話 前編

つまりなにしたの?

Pythonではデータ圧縮とアーカイブが標準ライブラリにあり、そのうちデータ圧縮をやる。
バイナリデータをバイナリデータのまま圧縮して変数に格納する。
f:id:ensekitt:20180909002924j:plain

*1

圧縮アルゴリズム

基本的には、簡易関数のcompressとdecompressを使う方法にする
13. データ圧縮とアーカイブ — Python 3.6.5 ドキュメント

gzip

GNUgzip形式を扱うモジュール
tarの後に実行して、tar.gzの形でお目にかかることが多い。
Lempel-Zivアルゴリズム (LZ77) とハフマン符号を使っている。
LZ77は先頭から順番に符号化していって、符号化の時に過去に符号化した内容と同じだったら、
過去に出たところのポインタと長さで置き換える処理。
gzip - Wikipedia

bzip2

こちらもtarの後に実行して、tar.bz2の形でお目にかかることが多い。
ブロックソート(バロウズ-ホイラー変換)とMTF (Move-To-Front) 法、ハフマン符号を使っている。
ブロックソートはデータを並び替えて圧縮しやすい形式に変換する前処理。
MTFは圧縮する記号を入れ替えるテーブルを使ってデータが偏るようにするらしい前処理。
gzipよりも効率的な圧縮がされるらしくて、比較的大きなファイル向け。
今回扱う小さめのデータだとあまり効果は出ないかも。
bzip2 - Wikipedia

LZMA

辞書圧縮を行うアルゴリズムとLZ77を改良したものとレンジコーダーというのを使っている。
よく分かっていないけどbzip2よりも効率的らしい。
Lempel-Ziv-Markov chain-Algorithm - Wikipedia

やってみる

やって見るデータ

個人的にちょっとやってみたいデータがあるので以下の4つのデータを圧縮してみる。

  • テキスト

日本語で1万字程度のテキストデータ

  • 音声

10分程度の音声(WAVE形式のステレオ音楽)

  • 画像

3840x2160のフルカラー画像

  • 大きいバイナリ

UbuntuのOSイメージ

次回はこれをPythonで実装してみる

ensekitt.hatenablog.com

書きました

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。