4.0.7の実験的機能であるカラム値の圧縮とRroongaからそれを使うにははじめにオープンソースのカラムストア機能付き全文検索エンジンとしてGroongaがあります。4.0.7では、カラムの値を圧縮して保存することができるようになりました。今回は、そのカラム圧縮がどれほど有効なのか、また、Groongaの機能をRubyから利用するためのライブラリであるRroongaから使うやりかたを紹介します。4.0.7ではzlibもしくは、lz4による圧縮を実験的にサポートしています。どんなケースだと嬉しいのでしょうか。カラムのデータがそれなりに大きい数バイトや数10バイト程度では、圧縮する方がサイズが大きくなる可能性があります。圧縮・展開のオーバーヘッドを無視できない可能性があります。カラムに格納しているデータがそれなりに大きいのであればディスク容量を節約できます。主な用途が全文検索のみである圧縮したカラムでもソートやドリルダウンできますが、データコピーが発生するので非圧縮の場合よりも遅くなります。そのため、Wikipediaの本文データなど、ソートやドリルダウンの対象としないようなデータを格納しているカラムを圧縮するのが効果的です。Groongaでカラム圧縮機能を試してみるでは、実際に試してみましょう。サンプルデータとしては、Wikipediaのデータを使ってみます。ストリーム指向の処理モデルを採用した分散全文検索エンジンであるDroongaのベンチマーク手順を利用するとデータの準備が簡単なので今回はそれを使います。ベンチマーク取得手順wikipedia-searchはDroongaを使ってWikipediaを検索するためのサンプルアプリケーションです。サンプルデータを用意するあらかじめ、Groongaをインストールしてあるものとします。ベンチマーク取得手順にあるようにwikipedia-searchのリポジトリデータを取得して、データの準備をしておきます。data:convert:groonga:jaを実行すると、Wikipediaの最新のアーカイブデータ(jawiki-latest-pages-articles.xml.bz2)をダウンロードしはじめます。1.88GiBあるのでダウンロードが完了するまでしばらく待ちます。ダウンロード後にGroongaにデータを投入するためのデータファイル(data/groonga/ja-pages.grn)が生成されます。デフォルトだと5000件の.grnファイルを生成しますが、データ件数をMAX_N_RECORDSで指定して、100万件のデータを生成します。非圧縮のGroongaのデータベースを構築する次のようにして、従来のカラム圧縮を利用しない非圧縮のデータベースを構築します。スキーマ定義は、config/groonga以下にschema.grnがあります。インデックスの定義も同様にindexes.grnがあるのでそれを使います。testdb-normal/dbカラム圧縮(zlib)のGroongaのデータベースを構築する今度はカラム圧縮(zlib)のデータベースを構築します。カラム圧縮(zlib)を適用するには、schema.grnを一行修正します。Textあとは、非圧縮の場合と同じようにしてデータベースを構築します。testdb-zlib/dbカラム圧縮(lz4)のGroongaのデータベースを構築する今度はカラム圧縮(lz4)のデータベースを構築します。カラム圧縮(lz4)を適用するには、schema.grnを一行修正します。Textあとは、非圧縮の場合と同じようにしてデータベースを構築します。testdb-lz4/dbデータベースのサイズを比較してみるここまでで、非圧縮、カラム圧縮(zlib)、カラム圧縮(lz4)それぞれでデータベースを作成しました。それぞれのデータベースが占めるディスク容量(GiB)をグラフにすると以下のようになりました。カラム圧縮(zlib)が約2.3GiB、カラム圧縮(lz4)が約2.5GiB、非圧縮で約3GiBという結果です。ここではベンチマークについては割愛しますが、まずはカラム圧縮(lz4)を試してみることをおすすめします。ディスク容量を節約したいならカラム圧縮(zlib)を使ってみてください。Rroongaでカラム圧縮機能を試してみるカラム圧縮の有用性がわかったところで、今度はそれをRroongaでもつかってみることにしましょう。4.0.6が必要です。Rroongaはgemとして提供されているので、以下のようにして簡単にインストールすることができます。rroongaRroongaで検索するだけなら、先ほどのデータベースをそのまま使えます。Rroongaを使って同じようなスキーマ定義を実現するにはどのようにすればよいのでしょうか。Groongaの場合と見比べてみましょう。schema.grnの内容は次のとおりでした。CategoriesこれをRroongaでは次のようにして定義します。endend注目するポイントは次の箇所です。:lz4)table.textはtext型のカラムを定義することを意味します。"text"はカラム名が"text"であることを意味します。:compressで圧縮方法を指定します。この場合はLZ4を使うことを意味します。zlibなら:zlibを指定します。デフォルトは非圧縮です。カラム圧縮を利用するのとは直接関係ないのですが、インデックスについてはどうでしょうか。indexes.grnの内容は次のとおりでした。title,textこれをRroongaでは次のようにして定義します。endendRubyらしい書き方で定義できることがわかりますね。4.0.7から導入されたカラム圧縮機能とGroongaをRubyから利用するライブラリであるRroongaでのスキーマ定義について紹介しました。来週末の11月29日(いい肉の日)には、全文検索エンジンGroongaを囲む夕べ5というGroongaとその関連プロダクトに関するイベントがあります。Groongaと関連プロダクトやツールの最新動向を知るのにおススメです。このイベントの休憩時間には検索エンジン自作入門の著者である山田さん、末永さんによるサイン会も開催します。4.0とGFDLのデュアルライセンスで自由に利用できます。クリアコードはプログラミングが楽しいソフトウェア開発者を1名募集しています。クリアコードは「クリアコードをいい感じにする人」を1名募集しています。クリアコードはフリーソフトウェア開発で培った技術力を提供しています。Thunderbird)とRubyとGroonga(全文検索)に関連した開発を得意としています。