BitmapMarking評価用ベンチマーク作り

shugoさんにSKKのようなプログラム作るといいんじゃないってアドバイスをもらった。
SKKに郵便番号と住所の変換表があった。
http://sakura.maid.ne.jp/skk-dic/skk_dic.html
client側で郵便番号を入力すると住所を返すようなデーモンを作る事に。
TCP通信でpreforkしたプロセスがacceptするようにしてみる。

require 'socket'

def postcode_dict(filepath)
  dict = {}
  open(filepath) do |f|
    f.each_line do |l|
      if /(\d+)\s\/(.+)\// =~ l
        dict[$1.to_sym] = $2
      end
    end
  end
  dict
end

def postcode2adress(postcode)
  adres = nil
  adres = @cache[postcode]
  unless adres
    adres = @dict[postcode]
    @cache[postcode] = adres
  end
  adres = "not found [input #{postcode}]"  unless adres
  adres
end

@cache = {}
@dict = postcode_dict(File.join(File.dirname(__FILE__), "SKK-JISYO.zipcode"))
Process.daemon
@server = TCPServer.new("localhost", 12345)
@proc = lambda do |s|
  while s.gets
    s.puts("#{postcode2adress($_.chomp.to_sym)}")
    s.puts("gc count : #{GC.count}")
    s.close_write
  end
end
5.times{ fork{ loop{ @proc.call(@server.accept) } } }
Process.waitall

 
こんな感じでできたのだが、一つ問題があって、
ruby1.9.0-4ではSEGVが発生する。がーん。
あと、trunkでも発生する。
 
どうしようかなぁ。うーん。
 
なんか間違った使い方してたら指摘していただけると。。。
# TCPServerなど

追記

redmineに投稿しました。
投稿したコードは以下

require 'socket'
GC.stress = true
@server = TCPServer.new("localhost", 12345)
pid = fork{ loop{ @server.accept } }
100.times{ s = TCPSocket.new("localhost", 12345); s.puts("foo\n") }
Process.kill "KILL", pid

追記2

make install したら直りました。
http://redmine.ruby-lang.org/issues/show/548
また、一つ恥をかきましたね。ぐすん。