[mecab-devel 73] Re: Javaから高負荷に呼び出すとbad_alloc exceptionがthrowされる

Back to archive index

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のタイミング
によってはかなりのメモリーを使う状況になりかねません。

くどう




Mecab-devel メーリングリストの案内
Back to archive index