臼田です。

namazu-devel-ja 向きなので、そちらに移しましょう。


On 2011/07/09, at 21:10, Shigekazu Aoyagi wrote:

> 
> 100MBを越えるPDFをインデクシングしようとすると、mknmzがメモリ不足を
> 起こすという現象がありました。
> mknmzを追いかけてみたところ、830行目の次のところで落ちていました。
> 
>            $mtype_m = $Magic->checktype_magic($$contref)
>              if ((! defined $mtype_c) ||
>                  $mtype_c =~
>                  /^(text\/html|text\/plain|application\/octet-stream)$/);
> 
> ファイル全体を $confref に読み込み、checktype_magic() にコピーで渡して
> 更に File::Magic 内でもコピーで渡されてという処理を繰り返している内に
> メモリ使用量が爆発してしまったようです。

$Magic->checktype_magic() ではファイル先頭の magic data を
チェックしているのでファイルの全体は必要ありません。
また、
$Magic->checktype_data() 内では受け取った値の 先頭部分を
切りとってから使用しています。

なので、mknmz から File::MMagic には先頭部分だけを渡せば
十分と思われます。

$ diff -u scripts/mknmz.org scripts/mknmz
--- scripts/mknmz.org   2011-07-11 21:21:23.000000000 +0900
+++ scripts/mknmz       2011-07-11 21:24:04.000000000 +0900
@@ -824,10 +824,11 @@
        } elsif (defined $mmtype) {
            $mtype = $mmtype;
        } else {
+           my $truncatedcont = substr($$contref, 0, 0x8564);
            my $mtype_n = $Magic->checktype_byfilename($cfile);
-           my $mtype_c = $Magic->checktype_data($$contref);
+           my $mtype_c = $Magic->checktype_data($truncatedcont);
            my $mtype_m;
-           $mtype_m = $Magic->checktype_magic($$contref) 
+           $mtype_m = $Magic->checktype_magic($truncatedcont) 
              if ((! defined $mtype_c) ||
                  $mtype_c =~ 
                  /^(text\/html|text\/plain|application\/octet-stream)$/);


といった感じでいかがでしょうか。

臼田幸生

_______________________________________________
Namazu-users-ja mailing list
Namazu-users-ja@namazu.org
http://www.namazu.org/cgi-bin/mailman/listinfo/namazu-users-ja

メールによる返信