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系の処理で生じていたメモリリークもすぐに確認することができて、
便利でした。
以上、よろしくお願いします。