zlibを使う

zip
データ内の出現パターンを調べ、出現頻度の高いビット構成をより短いビット構成で置き換えている。復元する際は辞書を使って元のビット構成を取り出す。
辞書
データの内容をなんらかの規則に従って表現したもの


前にrssxmlで保存するプログラムを書きました。これをマーシャルしてからgzファイルで保存するように変換します。

xml

  File.open("codezine-news.xml", "w") do |file|
    file.write(xml)
  end

gz

  Zlib::GzipWriter.open("codezine-news.data.gz") do |gz|
    Marshal.dump(rss, gz)
  end

それぞれのファイルを読み込む場合は下記
xml

  File.open("codezine-news.xml", "r:utf-8") do |file|
    xml = file.read()
  end
  old = RSS::Parser.parse(xml)

gz

  Zlib::GzipReader.open("codezine-news.data.gz") do |gz|
    old = Marshal.load(gz)
  end

書き込み・読み出しは書き方に少し違いがあって、気を付けるのはGzipReaderかGzipWriterの違いかな




hashで名前・住所・メモのnamelistというデータを作成し、gzファイルで保存するプログラムを以前書いた。そのgzファイルと今回の作成したrssのgzファイルの圧縮率を比べると、30%減と70%減だった。何故rssのgzファイルのほうが圧縮率が高いのか・・・。

自分なりに考えてみた
rssはnamelistよりデータ量が多い事と定型文で記述されているので、圧縮しやすいから。
解答
rssのほうが圧縮するファイルサイズが大きく、圧縮データ内で辞書が占める割合が相対的に小さくてすむから。また、同一パターンを置き換える率が高く、圧縮符号への変換が効果的にはたらくから。

という訳らしい。考え方はあってるが、「辞書」という言葉を使ったほうが深い説明になったな。データ量が多いほど頻出パターンが取りやすく圧縮しやすいってことが一番のミソなんですね。