はじめに
全文検索エンジン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を検討してみてはいかがでしょうか。