Taku Kudo
taku****@chase*****
2007年 10月 30日 (火) 00:09:22 JST
工藤です > 全文検索システムからmecabを使用していますが、 > 複数スレッドから高負荷に呼び出すと、bad_alloc exceptionがthrowされて > しまいます。 > デバッグしたところ、Nodeを生成しているnewでallocateに失敗しているようです。 > > 現在のソースではbad_allocをcatchしていませんので、結果としてterminateが > 呼び出され、強制終了してしまいます。 > > Javaから呼び出していますので、JNIのラッパー関数内でbad_allocをcatchして、 > Javaのexceptionに変換して戻すようにしましたが、そもそもallocateに失敗する > ほどメモリが枯渇しているわけではないようですので、newの失敗には別の理由が > あるのではと考えていますが、何かおわかりになりますでしょうか? Javaに関してはド素人なのですが、Java VM のメモリー使用量に 制限があったりしないでしょうか? > #taggerのインスタンスは処理ごとに生成しています。 処理ごととは具体的にどういう風に生成していますか? mecab のインスタンス化は非常にコストが高いので、 できるだけインスタンスを使いまわしたほうが、パフォーマンスがよいです。 もし、1文を解析する程度でインスタンスを作り、インスタンス の解放をGCに任せているのであれば、GCのタイミング によってはかなりのメモリーを使う状況になりかねません。 くどう