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

Mik*_*lls 0 linux perl rhel

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

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

而且我这样运行它

cat inputFile.x | perl test.pl > outputFile.x
Run Code Online (Sandbox Code Playgroud)

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

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

Mil*_*ler 9

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

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

在这个例子中,我建议只让perl open文件本身.您只需将文件名作为参数传递给脚本并迭代<>:

use strict;
use warnings;

while (my $line = <>) {
    print $line;
}
Run Code Online (Sandbox Code Playgroud)

并调用脚本如下:

perl test.pl inputFile.x > outputFile.x 
Run Code Online (Sandbox Code Playgroud)


jay*_*ngh 6

使用while循环:

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

while (my $line = <STDIN>) {
  print $line;
}
Run Code Online (Sandbox Code Playgroud)

此外,您不需要通过管道推送数据.您可以打开文件句柄并perl通读它:

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

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