スポンサーサイト

--年--月--日 --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Perl メモリ開放うんぬん

2009年11月25日 21:49

今日、メモリ開放周りで詰まったので覚書。

100M程度のデータを変数に入れてゴリゴリやる際に
スコープから外れたのに開放されねーよ、という事態に陥ったので。

メモリ使用量はpsなりタスクマネージャなりで確認した。


create_scar();
sleep;

sub create_scar
{
my $scar;
$scar .= " " for ( 1.. 1000000 );
}


例えば、↑だとメモリ食いっぱなし


sub create_scar
{
my $scar;
$scar .= " " for ( 1.. 1000000 );
undef $scar;
}


↑undefすれば開放。あたりまえか。


create_scar();
create_scar();
sleep;

sub create_scar
{
my $scar;
$scar .= " " for ( 1.. 1000000 );
}


↑これだとメモリは再利用される。

create_scar();
create_scar2();
sleep;

sub create_scar
{
my $scar;
$scar .= " " for ( 1.. 1000000 );
}
sub create_scar2
{
my $scar;
$scar .= " " for ( 1.. 1000000 );
}


↑これは倍メモリ食う


my $scar = create_scar();
sleep;

sub create_scar
{
my $scar;
$scar .= " " for ( 1.. 1000000 );
return $scar
}


↑これも倍


そんな感じで嵌ってました。

たぶん、再利用性の方を優先させた結果なんだろう。
まあ普通そんなでっかい領域確保しないもんね。

明示的に undef で FA

ただ、

sub create_scar
{
my $scar;
$scar .= " " for ( 1.. 1000000 );
$scar = substr($scar,0,10);
return $scar;
}


こういう処理のときはメンドイ

sub create_scar
{
my $scar;
$scar .= " " for ( 1.. 1000000 );
my $scar_tmp = substr($scar,0,10);
undef $scar;
return $scar_tmp;
}


こうしないと、$scarがデッカイまま。


スポンサーサイト


最近の記事


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。