我正在使用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
答案 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;
}