読者です 読者をやめる 読者になる 読者になる

CreateField Blog

オープンソースを使って個人でWebサービスを開発・運営していたブログ

GroongaとTokyoCabinetのHash表のベンチマークについて

Groonga

はじめに

全文検索エンジンGroongaは超高速な全文検索ライブラリとしての機能を有しますが、単純なハッシュ表等のAPIも提供されており、ファイルへの永続化前提のインプロセス型のKVS(key value store)としても利用することができます。

ファイルへの永続化前提のインプロセス型のKVSとしては、Tokyo Cabinetが有名です。

今回は、簡単にGroongaとTokyo Cabinetの速度と容量について比較してみました。

なお、Tokyo Cabinetには、後継のKyoto Cabinetがありますが、メンテナンス性等を重視してC++で実装されており、単純な性能であれば、Tokyo Cabinetの方がやや良いということでしたので、今回はTokyo Cabinetを利用してみました。

検証環境

項目 バージョン/種類
CPU Intel(R) Xeon(R) CPU E5620 @ 2.40GHz 1CPU 4Core
Memory 32GB
HDD 2TB(SATA 7200rpm) * 2 Hardware RAID 0
OS CentOS 6.4
Groonga 4.0.3
Tokyo Cabinet 1.4.33

検証手順

以下のようにして、Groonga、Tokyo Cabinetをインストールします。

% rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm
% yum makecache
% yum install -y groonga groonga-devel
% yum install -y tokyocabinet tokyocabinet-devel

Tokyo Cabinetは、CentOS6のbaseリポジトリ入りしており簡単にインストールできていいですね。

検証用に作ったC言語のプログラムをダウンロードしてコンパイルします。

https://github.com/naoa/groonga-tokyocabinet-bench

% git clone https://github.com/naoa/groonga-tokyocabinet-bench
% cd groonga-tokyocabinet-bench
% make

第1引数に構築するハッシュ表のキー数を設定して、キーと値の追加時間とキーから値を取得する時間を計測します。

% ./grn_hash_bench 1000000
% ./tchdb_bench 1000000

作成されたハッシュ表のファイルサイズを比較します。

% ls -lh groonga.grh tokyocabinet.tch

キーと値の追加時間

キー数 Tokyo Cabinet Groonga
10万 0.03sec 0.03sec
100万 0.54sec 0.35sec
1000万 40.17sec 4.35sec

Tokyo Cabinetは1000万で極端に遅くなっておりますが、何らかのチューニングポイントがあるかもしれません。ちなみに64GB以上はラージモードを使う必要があるらしいです。

http://alpha.mixi.co.jp/2010/10717/

キーから値を取得する時間

キー数 Tokyo Cabinet Groonga
10万 0.05sec 0.03sec
100万 0.56sec 0.28sec
1000万 18.91sec 2.78sec

ハッシュ表のファイルサイズ

キー数 Tokyo Cabinet Groonga
10万 5.1MiB 17MiB
100万 47MiB 65MiB
1000万 459MiB 661MiB

おわりに

Groongaは、全文検索だけではなく、ファイルベースのKVSとしてもとても優秀な速度性能を有しています。Tokyo Cabinetの方も十分に速く、空間効率に優れ、さらに、ファイルとして保持する場合はトランザクションの機能もあって堅牢性にも優れています。

GroongaのRubyバインディングのRroongaを使えば、Rubyからでも簡単にGroongaのハッシュ表を利用することができます。

以下の検証結果を見るとRubyのHashよりもTokyo CabinetのHashの方が速いということですので、Rubyで多数のキーと値のペアを保持したい場合は、Rroongaを使うことでRubyのHashよりも良いパフォーマンスが得られると思います。

http://www.xmisao.com/2013/10/04/tokyocabinet-ruby-benchmark.html

全文検索にGroongaを利用していて、KVSも利用したいという方はGroongaでのKVSを検討してみてはいかがでしょうか。