私が書いたperlスクリプトのメモリ使用に関するいくつかの問題があります(下記のコード)。スクリプトはいくつかの変数を開始し、それらをデータで満たしてから、それらを再び定義解除します。しかし、すべてを削除した後のスクリプトのメモリ使用量は、データを含まないためにはまだまだ高いものです。メモリからperlオブジェクトを削除する方法
ps
には、スクリプトは最初の39秒間に1.027 Mbのメモリ(RSS)を使用します(foreachループの前のすべて)。その後、メモリ使用量が上昇し始め、204.391 Mbから172.410 Mbの間で変動します。しかし、スクリプトの最後の10秒(すべてのデータが削除されるはずです)でも、メモリ使用量は決して172.410Mbを下回りません。
変数とその中のすべてのデータを(スクリプトのメモリ使用量を減らすために)perlで永久に削除する方法はありますか?もしそうなら、どうすればいいですか?
use strict;
use warnings;
sleep(30);
my $ELEMENTS = 1_000_000;
my $MAX_ELEMENT = 1_000_000_000;
my $if_condition = 1;
sleep(5);
my %hash = (1 => {}, 2 => {}, 3 => {}, 4 => {});
foreach my $key (keys %hash){
if($if_condition){
my $arrref1 = [ (rand($MAX_ELEMENT)) x $ELEMENTS ];
my $arrref2 = [ (rand($MAX_ELEMENT)) x $ELEMENTS ];
my $arrref3 = [ (rand($MAX_ELEMENT)) x $ELEMENTS ];
sleep(2);
if(!defined($hash{$key}->{'amplification'})){
$hash{$key}->{'amplification'} = [];
}
push(@{$hash{$key}->{'amplification'}},@{$arrref1});
undef($arrref1);
push(@{$hash{$key}->{'amplification'}},@{$arrref2});
undef($arrref2);
push(@{$hash{$key}->{'amplification'}},@{$arrref3});
undef($arrref3);
sleep(3);
delete($hash{$key});
sleep(5);
}
}
sleep(10);
170メガバイトはあまりありません。なぜあなたはとても保守的である必要がありますか?これは組み込みシステムですか? – Borodin
'[(rand($ MAX_ELEMENT))x $ ELEMENTS]'は、同じ数の1,000,000個のコピーを持つ配列を作成するでしょうか? – Borodin
大きな数字に数千の区切り文字を追加しました( '1_000_000_000')。これはPerlの構文的糖の1つです:[Perlによって無視されるwhitin数を強調し、読みやすさを向上させるかもしれない](http://perldoc.perl。org/perldata.html#スカラー値コンストラクタ)。 – PerlDuck