pack→gzip→dump

gzipする前にpackしてみました。
※なぜZlib::ZStreamを使わないかというと、まだ使い方を理解していないからです。てへ♪

require 'pathname'
require 'zlib'

a = Array.new(10000) do rand(10000) end

open('raw_data', 'wb')      { |f| f.write(Marshal.dump(a)) }
open('packed_32bit', 'wb')  { |f| f.write(Marshal.dump(a.pack("N*"))) }
open('packed_16bit', 'wb')  { |f| f.write(Marshal.dump(a.pack("n*"))) }

Zlib::GzipWriter.open('raw_data.gz') { |f| f.write(Marshal.dump(a)) }
Zlib::GzipWriter.open('packed_32bit.gz') { |f| f.write(Marshal.dump(a.pack("N*"))) }
Zlib::GzipWriter.open('packed_16bit.gz') { |f| f.write(Marshal.dump(a.pack("n*"))) }

%w(raw_data packed_32bit packed_16bit raw_data.gz packed_32bit.gz packed_16bit.gz).each do |n|
  printf("%-16s = %d\n", n, Pathname.new(n).size)
end

実行結果です。

raw_data         = 39613
packed_32bit     = 40006
packed_16bit     = 20006
raw_data.gz      = 23972
packed_32bit.gz  = 23856
packed_16bit.gz  = 18449

(このエントリはpack してから dumpにインスパイアされて書きました)