[Namazu-users-ja 1224] Re: 巨大なPDFのインデクシング

Yukio USUDA m6694ha392t @ asahi-net.or.jp
2011年 7月 11日 (月) 21:33:05 JST


臼田です。

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 メーリングリストの案内