非常简单的perl脚本有大量的内存泄漏

时间:2014-08-06 02:18:50

标签: linux perl rhel

我正在使用perl脚本来转换文件,发现只是从stdin读取并且写入stdout足以导致大量内存泄漏。它达到了大约20gig,我猜想被操作系统杀死了。这是一个显示问题的脚本。

#!/usr/bin/perl
use strict;
use warnings;
foreach my $line(<STDIN>)
{
  print $line;
}

我正在运行它

cat inputFile.x | perl test.pl > outputFile.x

一旦我以每秒0.5gig的速度运行这个记忆头。输入文件是68gig所以看起来perl永远不会释放内存。我尝试了各种各样的东西,比如undef $ line,使用ref,在foreach之外定义$ line。有没有办法强制perl释放内存?

编辑:注意,在Red Hat 6.5 64位上运行,Perl 5.10.1

2 个答案:

答案 0 :(得分:9)

foreach会在迭代之前将整个文件句柄加载到内存中。

相反,要逐行迭代文件,请始终使用while循环。

在这种情况下,我建议只让perl open文件本身。您只需将文件名作为参数传递给脚本并迭代<>

即可
use strict;
use warnings;

while (my $line = <>) {
    print $line;
}

并像这样调用脚本:

perl test.pl inputFile.x > outputFile.x 

答案 1 :(得分:6)

使用while循环:

#!/usr/bin/perl
use strict;
use warnings;

while (my $line = <STDIN>) {
  print $line;
}

此外,您无需通过管道推送数据。您可以打开文件句柄,让perl通读它:

#!/usr/bin/perl
use strict;
use warnings;

open my $fh, '<', 'my_big_file.txt' or die $!;
while (my $line = <$fh>) {
  print $line;
}