Franky's Blog

书山有路勤为径,学海无涯苦作舟……

Perl-如何释放数组或哈希占用内存

一般来说,在Perl中,内存的分配和释放并不是你可以或者应该多操心的事情!

截断一个数组并不回收其内存。你必须使用 undef(@whatever) 来把它的内存释放回你的进程的内存池里。你可能无法把它释放回你的系统的内存池,因为几乎没有那种操作系统支持这样做。在大多数操作系统上,分配给程序的内存永远不能返回给系统。

一旦Perl从操作系统中分配了内存,它就会在进程的整个生命周期中保留这些内存。在可能的情况下,Perl将重用它已经分配的内存,而不是向操作系统请求更多内存,但是你不会看到进程使用的内存减少。

最好方法是一开始就不要做任何浪费内存的事情。良好的编程实践可以在很大程度上实现这一目标。

如果你能逐行处理,就不要把整个文件读到内存中。或者更具体地说,使用像这样的循环。

1while (my $line = <$IN_PUT>) {
2   # ...
3}

而不是这样。

1my @data = <$IN_PUT>;
2foreach (@data) {
3    # ...
4}

当你要处理的文件很小的时候,你用哪种方式处理并不太重要,但是当文件开始变大的时候,就会有很大的不同。

在实际生产中,遇到过Perl程序占用内存高的情况。此Perl程序为长驻进程,循环读取不同的数据文件,且使用第二种方式将数据文件赋值于数组再处理每行数据。那么这个进程占有的内存只会增大,不会减少,占用内存取决于最大的数据文件大小。杀掉进程或者停止程序方可释放内存。


Share