pythonでKVS

KVSは基本的に(Pythonで言うところの)辞書をファイルに読み書き(永続化)する仕組みなので、
pythonが標準で持っているpickleというモジュールでも実現できるはずです。
しかし、pickleはpython専用ということもあり、一長一短のようです。
長所はやはり、pythonネイティブなので、Pythonクラスやリストといった辞書以外のものも
永続化できること。
短所はやはり、一般性に欠けるというところでしょう。
なので、専用のライブラリを使用するほうが一般的なんでしょう。
今回は由緒正しきbdbを使ってみましょう。Pythonではbsddbというモジュールが標準で用意されています。

まずはpickle(高速版のcPickle)の使用例

>>> d_square={}
>>> for i in xrange(1,10):
...     d_square[i]=i**2
...
>>> d_square
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
>>> import cPickle
>>> cPickle.dump(d_square,open('cpickle.dat','w'))
>>> d_square={}
>>> d_square
{}
>>> d_square=cPickle.load(open('cpickle.dat','rb')
... )
>>> d_square
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

辞書をそのまま永続化できるのが強みですが、まぁ、辞書本来の使い方としてはKVSそのままですので
(一覧で表示するような使い方は普通はしないでしょう)
bdbでも同じような使い勝手は出せるはず。(ただ、hashを使用した場合、整数はkey/valueに使用で
きないのがちと面倒)

>>> import bsddb
>>> db=bsddb.hashopen('hashtest.db','c')
>>> for i in xrange(1,10):
...     db[str(i)]=str(i**2)
...
>>> db.keys()
['2', '4', '6', '8', '1', '3', '5', '7', '9']
>>> db['3']
'9'
>>> db.sync()

それと、最近話題のTokyoCabinetを使ってみた。
標準ではPythonバインディングが提供されてないのでpytcを使用
pytc · PyPI
pytc-0.1 - Tokyo Cabinet Python bindings公開 - グニャラくんのグニャグニャ備忘録@はてな
(ほとんど、チュートリアルのまま)
pythonバインディングだけあってイテレータがさらりと使える辺り、結構便利かも

>>> import pytc
>>> db = pytc.HDB('hdb.db', pytc.HDBOWRITER | pytc.HDBOCREAT)
>>> for i in xrange(1,10):
...     db[str(i)]=str(i**2)
...
>>> db.items()
[('1', '1'), ('2', '4'), ('3', '9'), ('4', '16'), ('5', '25'), ('6', '36'), ('7', '49'), ('8', '64'), ('9', '81')]
>>> db['3']
'9'
>>> for key in db:
...     print 'key:',key,'value:',db[key]
...
key: 1 value: 1
key: 2 value: 4
key: 3 value: 9
key: 4 value: 16
key: 5 value: 25
key: 6 value: 36
key: 7 value: 49
key: 8 value: 64
key: 9 value: 81

ベンチマークもしてみたいところだけど、めんどくさいから、次回(やるのか?)
ほんの少ししかいじってないけど、tokyo caibnet、かなり速い感じ。
ただ、dbのサイズ自体、かなりでかい。
もっと多量のデータを入れ込むと差は縮まるのだろうけど
(それと、デフォルト設定のままだからなぁ)

-rw-r--r--  1 linux linux       75 2009-12-13 21:26 cpickle.dat
-rw-r--r--  1 linux linux    12288 2009-12-13 20:43 hashtest.db
-rw-r--r--  1 linux linux   528944 2009-12-13 21:21 hdb.db