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の速度調査 †
イメージとしては、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である。
こちらも同じく、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 でインストール出来ます。 計測 †
diskを使って、60万とか、70万とか出てきます。大体、dsbdbの10倍くらい出ている気がします。 ソース類 †計測に使ったソースは以下。python2.5以上で動くと思う。 |