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:ただしバックエンドとなるライブラリのバージョンは不明です