Text::MeCabがおかしい。某社社内より報告アリ。毎度ありがとうございます。

で、すでに数時間そのコードとにらめっこしている。なぜ思い通りに動かないのかよくわからない。根本的な問題はわかった。Text::MeCab::NodeオブジェクトがDESTROYされるのがなぜかスコープを脱出した時ではなく、Global Destruction時のタイミングで起こっているのが問題。

どういうことかというと、Perlは2つのタイミングでガーベッジコレクションを行う。ひとつはステートメントとステートメントの間(スコープが変わる時も含む)、そしてもうひとつはPerlのインタプレタ自体がメモリから削除されるGlobal Destruction時。

現在のText::MeCabでは、以下のように$nodeオブジェクトをどんどん変更して行っても、さっきまで入っていたオブジェクトのDESTROYが呼ばれずに、次のループに行ってしまう。そしてGlobal Destruction時に大量のDESTROYが走る。

my $mecab = Text::MeCab->new(); for(my $node = $mecab->parse($string); $node; $node = $node->next) { # do whatever }
でもこれだと(当たり前だけど)、for()内、いや、プログラムが終了されるまでメモリが解放されることがない。これでは駄目なのだ。SvREFCNT_incやSvREFCNT_decを色んなところに入れてみたんだけど、唯一正しいタイミングでガーベッジコレクトされるのは最初からSvREFCNTを0にしてしまう方法だけだった(これは当たり前のようにエラーがでる)

いったいどうすればいいんだ・・・?誰かヒントを・・・

カテゴリ

トラックバック(0)

このブログ記事に対するトラックバックURL: http://mt.endeworks.jp/cgi-bin/mt-tb.cgi/2053

コメントする

筆者

daisuke - a.k.a. "lestrrat", Perl hacker at Livedoor Inc, Japan Perl Association 代表理事

このブログ記事について

このページは、Dが2008年3月 6日 16:02に書いたブログ記事です。

ひとつ前のブログ記事は「MVCのモデルはDBじゃなくてもいいんだよ」です。

次のブログ記事は「Perlのmakeフェーズの挙動」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.1