Groonga Advent Calendar 2015の20日目の記事です。
もうすぐクリスマスですね。
ということで、MroongaでトークナイザにMecabを採用している時にたまに出くわす「mecab_sparse_tostr() failed len=XXX err=too long sentence.....」というエラーの解消方法を紹介します。
そもそもの原因
メッセージからも読み取れるとおり、取り込む文章が大きすぎてリソースが溢れてるというのは以下の記事でも触れています。
解消方法
Groongaバージョン 5.0.1 から追加されたプロパティを設定するだけです。
5.0.1リリース - 2015-03-29
[実験的][mecab] チャンクに分割してトークナイズできるようにしました。この機能は MeCabの "too long sentense" エラーの回避策です。有効にするには GRN_MECAB_CHUNKED_TOKENIZE_ENABLED 環境変数を yes に設定します。この設定により、Groonga は長いテキスト (デフォルトでは 8192 バイトを越えるテキスト)を小さなチャンクと呼ばれるかたまりに分割してMeCabへと渡します。この処理により、上記のエラーが発生しないようになります。
以下で実際に再現から解消されるかを検証してみます。
環境はAmazon Linux(Micro)で実施してます。
再現方法
-
以下を参考にMroongaをインストールします。トークナイザーとして MeCabもインストールしてください。
-
データベースを用意します。
# mysql -uroot -p mysql> create database mecabdb default character set utf8; mysql> grant all privileges on mecabdb.* to mecab@'%' identified by 'Mecab1234!'; mysql> exit;
-
テーブルを用意します。
# mysql -uroot -p mecabdb mysql > CREATE TABLE `mecab_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `content` LONGTEXT, PRIMARY KEY (`id`), fulltext index(content) comment 'parser = "TokenMecab"') ENGINE=mroonga AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
-
ビック文章をインサートしてみます。
# mysql -umecab -p mecabdb < big text.sql ERROR 1026 (HY000) at line 1: [tokenizer][mecab] mecab_sparse_tostr() failed len=2257788 err=too long sentence.
再現しました。このエラーを見ると現実逃避するためにスプラトゥーンを朝までやり続けた日々を思い出すわけですが、もう怖くありません。
解消方法
-
Mroongaを停止します。
# service mysqld stop
-
起動スクリプトにGRN_MECAB_CHUNKED_TOKENIZE_ENABLED 環境変数を設定します。
# vi /etc/init.d/mysqld export GRN_MECAB_CHUNKED_TOKENIZE_ENABLED=yes を序盤に追記
-
Mroongaを再開します。
# service mysqld start
結果確認
-
ビック文章をインサートしてみます。
# mysql -umecab -p mecabdb < big text.sql
エラー出てませんね。
-
インサートされてるか確認します。
# mysql -umecab -p mecabdb mysql> select count(*) from mecab_test; +----------+ | count(*) | +----------+ | 1 | +----------+ 1 row in set (0.00 sec)
まとめ(感想)
- 解決方法を須藤さんに伺った時は「ココらへんのソース読んでください」と言われ、どうなるこかと思いましたが、すんなり解決して良かったです。
- お陰様で年を越せそうです。来年もよろしくお願いします!