<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>臼田です</div><div><br></div>mknmzのメモリ消費については以前より課題になっています。<br>
<br>
メモリリークを見つけるために<br>
Devel::Leak というツールがあるという記事を見かけました。<br>
<a href="http://blog.livedoor.jp/dankogai/archives/50708868.html" target="_blank">http://blog.livedoor.jp/<wbr>dankogai/archives/50708868.<wbr>html</a><br>気になるサブルーチン呼び出しの前後で比較してみたところ<br>
<br>
File::MMagic::checktype_<wbr>byfilename<br>
が循環参照をしており、メモリリークをしているようだという<br>
ことをみつけました。<div><br><div>循環参照でのメモリリ-クを防ぐために<br>
Scalar::Util::weaken というものがあるようなのでこれを<br>
使ってみたところこの部分の問題は解消されました。<br>
<br>
$ diff -u <a href="http://MMagic.pm.org" target="_blank">MMagic.pm.org</a> MMagic.pm<br>
--- <a href="http://MMagic.pm.org" target="_blank">MMagic.pm.org</a> &nbsp; &nbsp; &nbsp; 2011-07-09 00:01:19.000000000 +0900<br>
+++ MMagic.pm &nbsp; 2011-07-09 21:46:42.000000000 +0900<br>
@@ -302,6 +302,7 @@<br>
<br>
&nbsp;use FileHandle;<br>
&nbsp;use strict;<br>
+use Scalar::Util;<br>
<br>
&nbsp;use vars qw(<br>
&nbsp;%TEMPLATES %ESC $VERSION<br>
@@ -715,6 +716,7 @@<br>
<br>
 &nbsp; &nbsp; $fname =~ s/^.*\///;<br>
 &nbsp; &nbsp; for my $regex (keys %{$self-&gt;{FILEEXTS}}) {<br>
+ &nbsp; &nbsp; &nbsp; Scalar::Util::weaken($self-&gt;{<wbr>FILEEXTS});<br>
 &nbsp; &nbsp; &nbsp; &nbsp;if ($fname =~ /$regex/i) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ((defined $type &amp;&amp; $type !~ /;/) || (! defined $type)) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$type = $self-&gt;{FILEEXTS}-&gt;{$regex}; # has no x-type param<br>
<br>
<br></div><div>上記とは別に<br>
mknmz 内にはグローバル変数に文字列を追加し続ける<div>mknmz::count_words と mknmz::make_phrase_hash の前後でも</div><div>参照数が増え続けています。<br></div><div>こちらは原因が違うので同じ対処方法は使えないようです。</div><div><br></div><div><div>臼田幸生</div><div><br></div></div></div></div></body></html>