[Namazu-users-ja 476] Re: mknmz の挙動について

Tadamasa Teranishi yw3t-trns @ asahi-net.or.jp
2005年 8月 29日 (月) 16:06:12 JST


寺西です。

Naoya Wakasugi wrote:
> 
> > > $ perl -d /usr/local/bin/mknmz 引数
> > > DB<1> t
> > > DB<2> c
> > >
> > > とするとトレースできるので、落ちた直前がどのようになっているか
> > > 教えていただけませんか?
> 
> とりあえず、終わる前の100行を取り出してみました。手掛かりになりますで
> しょうか。
...
> mknmz::write_phrase_hash_sub(/usr/local/namazu2/bin/mknmz:2197):
> 2197:                   my $adjrecord = adjust_first_docid($record, $last_docid);
> mknmz::adjust_first_docid(/usr/local/namazu2/bin/mknmz:2381):
> 2381:       my ($record, $last_docid) = @_;
> mknmz::adjust_first_docid(/usr/local/namazu2/bin/mknmz:2382):
> 2382:       my (@data) = unpack 'w*', $record;
> Out of memory!

フレーズデータの書き出し時にメモリオーバーになっていますね。

これだけではわかりませんが、ここにくるまでにどんどんメモリが少なく
なって、ここでたまたまメモリが足りなくて死んでしまったのか。
あるいは、ここの unpack で(無限ループに近い状態になって)どんどん
メモリを消費して死んでしまったかのどちらかでしょう。

# unpack で展開するから確かにメモリは消費するのだが...。

前者だと何処に問題があるのか、見つけるのは容易ではないです。
後者だと、たとえば $record の中身が壊れていて unpack でメモリを
大量に消費してしまったということが考えられるかもしれません。

あるいはフレーズデータが異常に大きすぎて...って可能性もあるのですが、
それなら古い OS でも同じ問題がおきそうだしなぁ。

とりあえず、mknmz の中の write_phrase_hash(); を呼び出している2箇所
をコメントアウトすると動いたりしませんか?
また、その時のメモリ使用状況はやっぱり2000M近くまで消費している
でしょうか?
# この状態だとフレーズ検索ができませんので、あくまでもテストという
# 意味ですが。
-- 
=====================================================================
寺西 忠勝(TADAMASA TERANISHI)  yw3t-trns @ asahi-net.or.jp
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint =  474E 4D93 8E97 11F6 662D  8A42 17F5 52F4 10E7 D14E




Namazu-users-ja メーリングリストの案内