読者です 読者をやめる 読者になる 読者になる

こしごぇ(B)

旧:http://d.hatena.ne.jp/koshigoeb/

dbmの"HASH: Out of overflow pages. Increase page size"を解決する方法が分からない

OSXでRubyのdbmを使った時に遭遇。

require 'dbm'
db = DBM.open('hoge', 0666, DBM::NEWDB)
1000000.times do |n|
  p n
  db[n.to_s] = 'a' * 1024
end

41838回目で例外発生。

HASH: Out of overflow pages.  Increase page size
DBMError: dbm_store failed
        from (irb):5:in `[]='
        from (irb):5
        from (irb):3:in `times'
        from (irb):3

できあがったファイルのサイズは158MB程度。
1MiB単位で追加していった場合は、ファイルサイズが16GB以上にふくれあがってディスク制限にひっかかって途中終了。

page size ってなんだろうか。いわゆる仮想記憶のページングのやつの事でいいんだろうか。

追記: 2012/09/27 (1)

  • require 'dbm' した際に使われるライブラリは環境によって異なる
    • 手元で問題が起きたコードは、コードが書かれた環境(Linux系)などでは問題が起きていない
  • gdbm をインストールして ruby をコンパイルし直し、GDBM を使って見たところ問題は回避できた
  • --with-dbm-type=gdbm として ruby をコンパイルし直してみた
    • dbm.bundle が gdbm にリンクした
    • DBM::VERSION は unknown のまま
    • 件の問題が発生した
    • gdbm_compat でも同様

追記: 2012/09/27 (2)

誤魔化し。

require 'dbm'
begin
  require 'gdbm'
  silence_warnings do
    DBM = GDBM
  end
rescue LoadError
end