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がデッカイまま。
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がデッカイまま。




最近のコメント