필자가 작성한 perl 스크립트의 메모리 사용에 약간의 문제가 있습니다 (아래 코드). 스크립트는 일부 변수를 시작하고 데이터로 채운 다음 다시 정의 해제합니다. 그러나 모든 것을 삭제 한 후 스크립트의 메모리 사용량은 여전히 데이터를 포함하지 않는 높은 수준입니다.메모리에서 perl 객체를 제거하는 방법
Accoke to 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의 구문 당 (syntactic sugars) 중 하나입니다 : [whitin 수는 Perl에서 무시되고 가독성을 향상시킬 수 있습니다.] (http : //perldoc.perl.org/perldata.html # 스칼라 값 생성자). – PerlDuck