2011年7月11日

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

臼田です。

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@xxxxx
http://www.namazu.org/cgi-bin/mailman/listinfo/namazu-users-ja


投稿者 xml-rpc : 2011年7月11日 21:33
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/105453
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。