Ruby体験記13 〜オブジェクトの永続化、圧縮

どうも。三十路です。

今日も2巻でお勉強。

Ruby 2 さまざまなデータとアルゴリズム (CD-ROM付) (プログラミング学習シリーズ)

Ruby 2 さまざまなデータとアルゴリズム (CD-ROM付) (プログラミング学習シリーズ)

オブジェクトの永続化

プログラム内部で作成したデータ(オブジェクト)をそのまま保存したり復元したりするのを永続化という。
Marshalモジュールを使うことで永続化することができる。
オブジェクトをバイナリ化(ようするに保存できる形式にすること?)することをマーシャルという。逆に復元することをデマーシャルという。

#マーシャル
t = Time.now
puts t
File.open "time_save.data", "wb" do |file|
  Marshal.dump t, file
end

#デマーシャル
t = nil
puts t
File.open "time_save.data", "rb" do |file|
  t = Marshal.load file
end
puts t

※全てのオブジェクトをマーシャル出来るわけではない。Fileオブジェクトなどはできない(OSに依存するので仮に保存しても他の環境では読み出せない。)

小問題1

#小問題1
array = [1, 2, 3, 4, 5]
File.open "array_save.data", "wb" do |file|
  Marshal.dump array, file
end
array = nil
puts array
File.open "array_save.data", "rb" do |file|
  array = Marshal.load file
end
puts "#{array}"

圧縮

データの内容を変えずに元のサイズよりもサイズを小さくすることを圧縮という。圧縮したデータを元に戻すことを復元または伸長、展開という。
元のデータと完全に同じように復元できる圧縮を可逆圧縮。また元には完全に戻せない圧縮を非可逆圧縮という。

def make_zero(count)
  r = ""
  if count > 1
    r = "Z#{count}"
  elsif count == 1
    r = "0"
  end
  r
end

def compress(nums)
  r = ""
  count = 0
  nums.each_char() do |c|
    if c == "0"
      count += 1
      if count == 10
        r << "Z0"
        count = 0
      end
   else
      r << make_zero(count)
      count = 0
      r << c
    end
  end
  r << make_zero(count)
end

aa = "3200000000008000000329000000000"
aa.each do |arg|
  puts "#{arg} => #{compress(arg)}"
end

require "zlib"
require "pp"

Zlib::GzipWriter.open "namelist.data.gz" do |gz|
  File.open "namelist.data", "rb" do |data|
    gz.write data.read
  end
end

Zlib::GzipReader.open "namelist.data.gz" do |gz|
  pp(Marshal.load(gz))
end

そんな日。