[groonga-dev,01818] Re: mecabトークナイザでのtoo long sentenceの回避方法について

Back to archive index

Naoya Murakami visio****@gmail*****
2013年 9月 26日 (木) 08:16:53 JST


お世話になっております。村上です。

すいません。もう一度ソースを見直してみたところ、だめだめな点に気づいたので、
修正したら、これまで、corrupted double-linked listが発生してたところで、
再現しなくなりました。

データベースが大きいので、まだ、全インデックス構築は完了していませんが、
おそらくは、うまくいきそうです(いってほしい)。
この事象は、当方のミスでした。大変失礼しました。

>手元でも試してみたいので、以下の情報を教えてもらえませんか?
>  1. mroongaでのテーブル定義
     (どのトークナイザーを使っているかを知りたい)
>   2. エラーが発生したINSERT文
     (どのデータで問題なのかを知りたい)
>  3. 1., 2.のgrnntestバージョンの作成
>  4. 3.で問題が再現するかどうかの確認

トークナイザは、TokenMecabStopWordsLengthProlongを使っています。
PartOfSpeechは、速度の劣化が著しいので、とりあえず放置してました。

細かく分割すると、事象が発生せず、ある部分を含んで、且つ、ある一定量のサイズを
オフラインインデックス構築すると事象が発生していました。
なので、特定のINSERT、特定のデータのオフラインインデックス構築だけでは再現せず
厄介でした。

しかし、上記を整理するために、オリジナルのMecabのトークナイザにmecab_sparse_tostrの
分割処理のみだけを追加したものを作っているうちに、だめだめなところが気づきました。

https://github.com/naoa/groonga-tokenizer-customized/blob/master/tokenizers/mecablong.c

ちゃんとgrntestで分割処理を動きを確認することにより、ループの最後の処理がうまく終わってなくて、
複数回、無駄な処理がやられていることに気づけました。
(無駄な分かち書きはされず、うまくいくケースもあったので、前は気づきませんでした。)

https://github.com/naoa/groonga-tokenizer-customized/blob/master/test/suite/mecablong/TokenMecabLong.actual

また、放置していたpartofspeech系の処理で生じていたメモリリークもすぐに確認することができて、
便利でした。

以上、よろしくお願いします。



groonga-dev メーリングリストの案内
Back to archive index