Ruby体験記13 〜オブジェクトの永続化、圧縮
どうも。三十路です。
今日も2巻でお勉強。
![Ruby 2 さまざまなデータとアルゴリズム (CD-ROM付) (プログラミング学習シリーズ) Ruby 2 さまざまなデータとアルゴリズム (CD-ROM付) (プログラミング学習シリーズ)](https://images-fe.ssl-images-amazon.com/images/I/51FBIkFfhbL._SL160_.jpg)
Ruby 2 さまざまなデータとアルゴリズム (CD-ROM付) (プログラミング学習シリーズ)
- 作者: arton,宇野るいも
- 出版社/メーカー: 翔泳社
- 発売日: 2009/02/13
- メディア: 大型本
- 購入: 1人 クリック: 48回
- この商品を含むブログ (21件) を見る
オブジェクトの永続化
プログラム内部で作成したデータ(オブジェクト)をそのまま保存したり復元したりするのを永続化という。
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
そんな日。