at posts/single.html

Ruby学習記 - YAML (2)

ちょっと間が空いたけど、再び YAML について調べる。 YAML::Store を使えば、PStoreと同じように Ruby のオブジェクトをファイルへ読み書きできる。 ここで気になるのは、ファイルからオブジェクトを読み込むときには、 全てのオブジェクトがオンメモリに展開されるのかどうかということ。

そこで試しに、2つのプログラムで速度を計測してみる。 ファイル store.txt には3000個の要素を持つ Array 型のオブジェクトが格納されている。 まずは、格納されているデータを別のオブジェクトにコピーするパターン。

require 'yaml/store'

data = Array.new
db = YAML::Store.new('store.txt')
db.transaction { data = db['data'] }
data.each do |line|
   puts line
end

次が、格納されているデータを直接読みにいくパターン。

require 'yaml/store'
db = YAML::Store.new('store.txt')
db.transaction {
   db['data'].each do |line|
      puts line
   end
}

両方を比べてみたけど、結果はほぼ同じだった。 yaml/store.rb を見てみると、transaction が実行されるときに @table = YAML::load( file ) としているから、全てのオブジェクトをオンメモリに展開しているみたい。 このへんは、PStoreを使った場合と同じかな。

まぁ、それほど大きなオブジェクトを扱わないようにすれば、問題ないか。

その他メモ

  • yaml.rb のドキュメントはRubyリファレンスマニュアルには載っていない。yaml4rが公式みたい。
  • YAML::Store#transaction は、データに変更がなくてもブロックが閉じたときにファイルへ書き込む。書き込みが不要なときは、YAML::Store#abort を明示的に呼ぶこと。
  • YAML::Store は PStore を継承しているので、PStoreのドキュメントを読めば十分かも。

関連する日記