Hatena::Grouprubyist

たばさの RSSフィード

12/25(金) 2009

file書き込みを減らしたい

| 09:10 | file書き込みを減らしたい - たばさの を含むブックマーク はてなブックマーク - file書き込みを減らしたい - たばさの

とくにSDなどを使ってスクリプトを動かすとログなどの書き込み回数が気になる。しかしそのためだけに元スクリプト自体はいじりたくない。と思ってテスト。ファイルごとにバッファを作る。終了時に残ったのをフラッシュ。

うまくいったら-rオプションでrequireして書き込みのとこだけ調整して変えられるようにできるんだったかな。


#!ruby
#openhooktes.rb

class File
  alias :old_puts :puts
  alias :old_close :close
  alias :old_initialize :initialize
  @@buffersize=5
  @@fbuffer={}
  @@names=[]
  def initialize *a
    STDERR.puts a*"," if $DEBUG
    @name=a[0]
    (@@names<<@name;@@fbuffer[@name]=[]) if ! @@names.member?(a[0])
    old_initialize *a
  end

  def puts *data
    STDERR.puts"(test)" if $DEBUG
    @@fbuffer[@name]+=data
    STDERR.puts"(push #{@name} #{@@fbuffer[@name].size}})" if $DEBUG
    if @@fbuffer[@name].size<@@buffersize
      STDERR.puts"(skip)" if $DEBUG
      return
    else
      old_puts "(#{Time.now})" if $DEBUG
      old_puts @@fbuffer[@name]
      STDERR.puts"(write all #{@name} #{@@fbuffer[@name].size}})" if $DEBUG
      @@fbuffer[@name]=[]
    end
  end
  def close
    STDERR.puts"(close)" if $DEBUG
    old_close
  end
  def File.endflush
    @@fbuffer.keys.each{|k|
      open(k,"a"){|f|
        f.old_puts "(flush)" if $DEBUG
        f.old_puts @@fbuffer[k]
      }
    }
  end
  def File.setbsize s
    @@buffersize=s if s>1
  end
end


END{
  File.endflush
  puts "flush bye" if $DEBUG
}


# test start

123.times{|i|
  open("test1.txt","a"){|f| f.puts i}
  open("test2.txt","a"){|f| f.puts i}
}
File.setbsize 11

123.times{|i|
  open("test1.txt","a"){|f| f.puts i}
  open("test2.txt","a"){|f| f.puts i}
}

トラックバック - http://rubyist.g.hatena.ne.jp/hatecha/20091225
カレンダー
<< 2009/12 >>
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
archive Error : RSSが取得できませんでした。