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