use*_*095 2 perl memory-management
我在编写的perl脚本的内存使用方面遇到了一些问题(下面的代码).该脚本启动一些变量,用数据填充它们,然后再次取消定义它们.但是,删除所有内容后脚本的内存使用量仍然很高,不包含任何数据.
Accoring到ps脚本使用的前39秒内1.027 MB内存(RSS)(foreach循环之前,所以一切).然后,内存使用量开始上升,最终在204.391 Mb和172.410 Mb之间波动.但是,即使在脚本的最后10秒内(应该删除所有数据),内存使用量也不会低于172.410 Mb.
有没有办法永久删除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);
Run Code Online (Sandbox Code Playgroud)
Perl FAQ 3 - 如何释放数组或散列,以便我的程序缩小?
你通常不能.分配给词汇(即my()变量)的内存即使超出范围也无法回收或重用.如果变量返回范围,则保留它.分配给全局变量的内存可以通过使用undef()和/或delete()重用(在程序中).
在大多数操作系统上,分配给程序的内存永远不会返回给系统.这就是为什么长期运行的程序有时会重新执行的原因.某些操作系统(特别是使用mmap(2)分配大块内存的系统)可以回收不再使用的内存,但在这样的系统上,必须配置和编译perl以使用OS的malloc,而不是perl.
一般来说,内存分配和取消分配不是你可以或应该在Perl中担心的事情.
另请参阅"如何使我的Perl程序占用更少的内存?"
| 归档时间: |
|
| 查看次数: |
253 次 |
| 最近记录: |