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にインスパイアされて書きました)