我编写的 Perl 脚本的内存使用存在一些问题(代码如下)。该脚本启动一些变量,用数据填充它们,然后再次取消定义它们。但是,删除所有内容后脚本的内存使用率仍然很高,无法包含任何数据。
根据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);
Perl 常见问题解答 3 -如何释放数组或散列以使我的程序缩小? http://learn.perl.org/faq/perlfaq3.html#How-can-I-free-an-array-or-hash-so-my-program-shrinks
你通常不能。分配给词法的内存(即 my() 变量)
即使超出范围也无法回收或重复使用。这是
保留以防变量返回范围。分配的内存
全局变量可以通过使用重用(在您的程序内)
undef() 和/或delete()。
在大多数操作系统上,分配的内存
程序永远无法返回到系统。这就是为什么
长时间运行的程序有时会自行重新执行。部分经营
系统(特别是使用 mmap(2) 分配大块的系统
内存)可以回收不再使用的内存,但是在这样的情况下
系统中,必须配置和编译 perl 才能使用操作系统的 malloc,
不是 Perl 的。
一般来说,内存分配和释放不是
在 Perl 中你可以或应该非常担心的事情。
也可以看看
“我怎样才能让我的 Perl 程序占用更少的内存?”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)