pythonのhashとdbm速度調査

メモリーとDiskの速度を比較する。

dbmとは、

pythonには、dbmと言って、データの内容を保存する仕組みがある。

保存の仕方は、次みたいにする。

>>> import anydbm #anydbmをインポート
>>> d=anydbm.open('test.dbm','n') #test.dbmと言う名前で、作成。nは常に新しく作る。
>>> d['foo']='bar' #hashの様に、keyを決めて、内容を書き込む(キー、値ともに、文字列で書き込むこと)。
>>> d['foo'] #参照する際は、キーで参照
'bar'
>>>exit() #一旦抜けて見る。

>>> import anydbm #再度やって見る。
>>> d=anydbm.open('test.dbm','c') #test.dbmの開く。
>>> for k in d: #hashの様にfor でキーを取得できる。
...   print k
...
foo
>>> d['foo'] #キーfooに結びついた値が取れる。
'bar'

dbmは、NoSQLの一種、(TokyoCabinet)等に使われる技術でもある。

hashとdbmの速度調査

それでは、dbmとhashではどのくらい速度が違うのか試して見る。 言い換えると、dbmは、ディスクへの保存、hashは、メモリーへの保存である。つまり、diskとmemoryの速度差を見ることでもある。 dbmは、dbhashを使用。pythonのVersionは、2.6だったと思う。使用したOSは、ubuntu9である。

1000から一億までの数字を、KeyとValueにして、試して見た。 心臓部のソースコードは以下。順次アクセスして、writeとreadを試している。

@t_profile('write')
def write(db,limit):
    for i in range(limit):
        db[str(i)]=str(i) #dbmは文字列しかキー、値にならないので、文字列化
    return limit

@t_profile('read')
def read(db,limit):
    for i in range(limit):
        v=db[str(i)] 
        assert(i==int(v))
    return limit

その際の、QPS(Query Per Second)を計測する。

AmazonEC2上のhash,dbm速度調査

試したのは、amazon EC2上のx.largeインスタンス。OSは、ubuntu9.04である。

EC2上でのdbm,hashの速度調査

counthash read(QPS)hash write(QPS)dbm read(QPS)dbm write(QPS)
100001000000100000071428.5762500
1000001111111.111111111.1157142.8647619.05
1000000840336.13840336.1361957.8739682.54
10000000711237.55880281.6959059.7737181.63

dbm_hash.png

イメージとしては、hashなら、100万qps程度。dbmなら、7-3万qps程度だとイメージしておけば良い(他のdbm TokyoCabinetならもっと早いだろうが、デフォルトのdbmでもこのくらいの速度は出る)。

自宅のVMWare上でのdbm,hashの速度調査

同様の調査を、VMWare上で行う。

母艦マシンは、iMac(WindowsXPを動かしている)。VMWare Server Ver2,動かしたOSは、ubuntu9.10である。

割り当てたメモリは、512MB,割り当てたCPU数は、1である。

counthash read(QPS)hash write(QPS)dbm read(QPS)dbm write(QPS)
100001000000100000010000076923.08
100000909090.911111111.1171428.5752910.05
1000000862068.971041666.6768681.3245289.86
10000000メモリ不足で実行できずメモリ不足で実行できず66657.7838411.31

vmware_dbm_hash.png

こちらも同じく、hashだと、100万QPS程度、dbmだと、8万から、3万程度だと考えておけば良いだろう。 IOSTATを見ていて、EC2よりも、VMWare上のHDDの方が書き込みが少し、早いように感じた。

おまけ、TokyoCabinetを試して見た。

Tokyo Cabinetは、早いdbm見たいな物。

TokyoCabinetでのr/w性能の評価を、VMWare上で行う。特に、パラメータの調整を行っていない。

母艦マシンは、iMac(WindowsXPを動かしている)。VMWare Server Ver2,動かしたOSは、ubuntu9.10である。

割り当てたメモリは、512MB,割り当てたCPU数は、1である。

TokyoCabinetのPython Bindingの準備

ぐにゃらくんが、TokyoCabinetのPython Bindingを作ってくれている。

sudo easy_install pytc

でインストール出来ます。

計測

counthash read(QPS)hash write(QPS)dbm read(QPS)dbm write(QPS)tc read(QPS)tc write(QPS)
100001000000早すぎて計測できず1250001000001000000500000
100000909090.911111111.1171942.4555248.62666666.67909090.91
1000000869565.221020408.1668634.1845475.22581395.35769230.77
10000000メモリ不足で計測できずメモリ不足で計測できず67240.4538660.79273224.04130718.95

dbm_tc.png

diskを使って、60万とか、70万とか出てきます。大体、dsbdbの10倍くらい出ている気がします。

ソース類

計測に使ったソースは以下。python2.5以上で動くと思う。

filedbm_bench.py


添付ファイル: filedbm_bench.py 5500件 [詳細] filedbm_hash.png 4836件 [詳細] filedbm_tc.png 4894件 [詳細] filevmware_dbm_hash.png 4815件 [詳細]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-02-01 (日) 14:38:23 (989d)