我正在使用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
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)
使用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)