全文検索エンジンGroongaの制限事項の補足 - 大規模データに備えるには

> もっとGroongaを知ってもらおう!ということで週刊Groongaをはじめました。毎週木曜にGroongaやMroonga、Rroongaのトピックを投稿予定です。

[gihyo.jp](http://gihyo.jp/)さんでGroongaの隔週連載が最終回を迎えました。Groongaの最新情報と今後に興味があれば一読をおすすめします。該当記事は[「最終回　Groongaの今と未来」](http://gihyo.jp/dev/clip/01/groonga/0011) です。

第1回から第10回までの過去記事については、[隔週連載Groonga](http://gihyo.jp/dev/clip/01/groonga)のページを参照してください。

今年も11/29に[全文検索エンジンGroongaを囲む夕べ
4](http://atnd.org/events/43461)を開催することになりました。Groongaのいろんな話を聞きたい人にはおすすめです。すでに参加希望者が130名を超えました！まだ若干余裕はありますが参加登録はお早めに! 発表者も決まったので[タイムテーブル](http://atnd.org/events/43461#time-table)に反映しました！

# はじめに

オープンソースの[カラムストア機能付き全文検索エンジンGroonga](http://groonga.org/ja/)を公開しています。最新のバージョンは2013年10月29日にリリースした[3.0.9](http://groonga.org/ja/docs/news.html#release-3-0-9)です。

今回は、Groongaの制限事項について紹介します。

# Groongaの制限事項について

全文検索エンジンであるGroongaにはいくつか[制限事項](http://groonga.org/ja/docs/limitations.html)があります。

* テーブルごとの制限
* インデックスの制限
* カラムの制限
* Windows版の制限

## テーブルごとの制限

テーブルごとでは、主キーのサイズに4096バイトという制限があります。

たとえば、Groongaでは次のようにしてテーブルをつくります。

```
table_create Sample TABLE_HASH_KEY ShortText
```

上記のようにして作成したSampleテーブルでは、主キーとしてShortText型のデータを格納することができます。

[データ型](http://groonga.org/ja/docs/reference/types.html)の説明をみて、ShortText型でなくてText型やLongText型を使えばこの制限を回避できるのではと思うかも知れませんが、実際にはText型やLongText型を主キーとしたテーブルを作成することはできません。

```
% groonga testdb/db
> table_create Sample TABLE_HASH_KEY Text
[[-22,1383792075.07247,0.000952959060668945,"[table][create] key size too big: <Sample> <Text>(65536) (max:4096)",[["grn_table_create_with_max_n_subrecs","db.c",780]]],false]
> table_create Sample TABLE_HASH_KEY LongText
[[-22,1383792792.7155,0.000756502151489258,"[table][create] key size too big: <Sample> <LongText>(2147483648) (max:4096)",[["grn_table_create_with_max_n_subrecs","db.c",780]]],false]
> 
```

また、主キーのサイズの合計が4Gバイトという制限もあります。
そのため、ひとつ一つの主キーのサイズが小さくても、テーブルのレコード数が多ければ、この制限に引っかかる可能性があります。

## インデックスの制限

インデックスについても次のような制限があります。

* 最大レコード数: 268,435,455 (約2億6千万)
* 最大語彙数: 268,435,455 (約2億6千万)
* 最大インデックスサイズ: 256GByte

たとえばトークナイザーとしてTokenBigramを使うことができますが、バイグラムを使うと語彙表テーブルの語彙数が膨れあがるので、データ量によってはインデックス構築時にこの制限に引っかかる可能性があります。その場合にはテーブルを分割するなどの対策が必要になるでしょう。

いまのところ、インデックス構築によりサイズがどれくらいになるかを簡単に見積る方法がないので、すくなくとも16GBを超えるデータベースを扱うようになってくると、使用メモリなどについても注意が必要になってくるでしょう。例えば、[mmap Cannot allocate memoryエラーを回避するには](http://groonga.org/ja/docs/troubleshooting/mmap_cannot_allocate_memory.html)というよく知られた問題があります。

## カラムの制限

インデックスについても次のような制限があります。

* カラムごとのサイズを合計した上限値: 256GiB

たとえば、column_createで作成したLongText型のカラムでカラムに保存するデータ量が大きければ、それほどデータ件数がなくても256GiBの制限にひっかかることがありえます。

## Windows版の制限

GroongaはWindows版も提供しているのですが、そちらにも特有の制限があります。
Groonga(のWindows版)ではデータベースファイルを128MiBごとに確保するようになっているので、保存するデータ量が少ない段階でもそのぶん容量を食います。
そしてデータ量が128MiBをこえるとまた128MiB確保するというふるまいになっています。
そのため、テーブルを大量に作成するけれども、投入するデータ量はそれほどでもない場合にはあまりディスク利用効率がよろしくありません。

いまのところこれはWindows版の仕様となっています。

# まとめ

今回は、全文検索エンジンGroongaの制限事項を紹介しました。

大規模なデータをGroongaを扱うようになってくると、どんな制限があるのかは気になるポイントです。これらGroongaの制限の多くを撤廃したgrnxx(ぐるんたす)の開発も進んでいます。今月の[全文検索エンジンGroongaを囲む夕べ4](http://atnd.org/events/43461)ではgrnxxの発表があるので、興味があるひとはぜひ参加してみてください。

Groongaに興味を持ったなら、まずは[インストール](http://groonga.org/ja/docs/install.html)して試してみてください。

Groongaの基本的な動作を知るための[チュートリアル](http://groonga.org/ja/docs/tutorial.html)もあります。インストールしたら試してみてください。