[Namazu-devel-ja 780] File::MMagic::magicMatchStr Re: File::MMagic::checktype_data

Yukio USUDA m6694ha392t @ asahi-net.or.jp
2005年 12月 17日 (土) 22:54:20 JST


臼田です。

File::MMagic::magicMatchStr と
File::MMagic::readMagicLine の実行回数が異常に多かった理由がわかりました。

【1.File::MMagic::readMagicLine の不具合】
引数で持っている配列のレファレンスをコピーしていて失敗しているようです。
magicMatchStr の中で $self->{magic}->[] の中身が読込済でなければ
readMagicLine を呼び出し、読み込んだ結果で置き換えており、本来ならば
magic データの個数しか呼び出されないはずなのですが、何回呼び出されても
初期状態のままなので magicMatchStr の実行回数と同じだけ呼び出されてい
ました。これは下記のように修正することで期待通りの動作になりました。

     # this item, then parse out its structure.  @$item is just the
     # raw string, line number, and subtests until we need the real info.
     # this saves time otherwise wasted parsing unused subtests.
-    $item = readMagicLine(@$item) if @$item == 3;
+
+    if (@$item == 3){
+        my $tmp = readMagicLine(@$item);
+        @$item = @$tmp;
+    }

【2.File::MMagic::magicMatchStr (pdfファイルの場合)】
テストしていた文書群は html ファイル約500個、pdf ファイル約200個というもの
でした。
File::MMagic::checktype_magic は配列に格納している magic データを
順にチェックしていますがpdfファイルの magic データが配列の100番目以降に
あるため判定がされるまでに
File::MMagic::magicMatchStr がかなりの回数呼び出されます。
_DATA_領域の上のほうに持っていくことで呼び出し回数がかなり減りました。
$self->{magic}->[]の中身の順番を判定すべきファイルを先頭に持っていくことが
できればと思います。

【3.File::MMagic::magicMatchStr (htmlファイルの場合)】
内蔵の magic データが古いため <!DOCTYPE HTML PUBLIC
で始まるファイルを text/html として識別できず全 magic データでの
チェックを行っています。
File::MMagic::magicMatchStr がファイル数の100倍以上呼び出されていた
理由は主にこれでした。
<!DOCTYPE HTML PUBLIC を magic データに追加するか mknmz の filter/html.pl
側で addSpecials をしておくのが良いと思います。

これらの修正で magicMatchStr の呼び出し回数が 80,000回から 8,000回まで減り
ました。
前回の修正とあわせると場合によっては処理時間が大分短くなると思います。


また mknmz では最終判定にFile::MMagicの判定をつかっておらず
File::MMagic::checktype_data
File::MMagic::checktype_magic
File::MMagic::checktype_byfilename
の3つをひととおりためして独自に判断をしています。
html 系ファイルの最終判定に checktype_magic を使わなくてすむように
すれば効率化できるのではと思います。

臼田幸生





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