GDBM なファイルが 32 bit と 64 bit で非互換でハマった
32 bit OS で作った GDBM ファイルを 64 bit OS に持っていって tie したら Invalid argument って怒られてしまいました。がーん。
ついでなので,他の DBM だとどうなのか調べてみました。
もとファイルは日本郵政公社の郵便番号ファイルで,これをあれこれ加工したデータが約 5.8 M です。
これを,SQLite3, DB_File($DB_HASH*1), GDBM_File, SDBM_File に放り込んでみました。
生成された結果。
% ls -lh zip.* 11M ... zip.db 14M ... zip.gdb 16K ... zip.sdb.dir 121M ... zip.sdb.pag 9.0M ... zip.sqlite3
ちょ,SDBM !
ともあれ,これらの sha1sum ですが,
2d529fb0f92ea9046f8071fac354cd37837eb37e zip.db [32 bit] 5c9641845394ceac5c6c2e8636b735687aecf579 zip.db [64 bit] 39c9ec4351fc913c2a7ea0bc29ff6ca59e40393d zip.gdb [32 bit] 7917dc6aa5bed5033d23dffa9790818b5ca8e41c zip.gdb [64 bit] fd471a82e4668b405eb82331889636bbefd71912 zip.sdb.dir [32 bit] fd471a82e4668b405eb82331889636bbefd71912 zip.sdb.dir [64 bit] f284bdcd39a360673e004b07a65cd81c08ccc4a8 zip.sdb.pag [32 bit] f284bdcd39a360673e004b07a65cd81c08ccc4a8 zip.sdb.pag [64 bit] e57f7ca7ce92d6af76da9b8e20b3a07536a3c0b0 zip.sqlite3 [32 bit] e57f7ca7ce92d6af76da9b8e20b3a07536a3c0b0 zip.sqlite3 [64 bit]
この時点で同一性が保証されているのは SQLite3 と SDBM。
GDBM は,32 bit ⇒ 64 bit にもっていったところ,やはり「Invalid argument」と怒られました。
DB (Berkeley DB) は同一ではないのですが,32 bit ⇒ 64 bit に持っていっても読めました。ホッ。逆のケースは確かめていません。容量のパフォーマンスもいいし今回はこちらを使うことにしようかなぁ…… Berkeley DB って色々互換性とか不安もあるんですけどね。
容量について追記
ls -ls してみたら……
% ls -lsh zip.* 8.6M ... 11M ... zip.db 14M ... 14M ... zip.gdb 16K ... 16K ... zip.sdb.dir 14M ... 121M ... zip.sdb.pag 9.0M ... 9.0M ... zip.sqlite3
アッ!大きいのは sparse file じゃん。でもマシン間コピーしたら増えるだろうし。
*1:ただしバックエンドとなるライブラリのバージョンは不明です