我最近不得不解析几个大约 6 GB 的日志文件。缓冲是一个问题,因为当我将 STDIN 分配给一个数组时,Perl 很乐意尝试将这 6 GB 读入内存……但是,我根本没有可用的系统资源来执行此操作。我想出了以下解决方法,它只需逐行读取文件,从而避免大量内存黑洞缓冲漩涡,否则会占用我所有的系统资源。
注意:这个脚本所做的就是将这个 6 GB 的文件分成几个较小的文件(其中的大小由每个输出文件中包含的行数决定)。有趣的是while循环和从日志文件到变量的单行赋值。循环将遍历整个文件,读取一行,用它做一些事情,然后重复。结果,没有大量缓冲......我保持整个脚本完好无损只是为了展示一个工作示例......
#!/usr/bin/perl -w
BEGIN{$ENV{'POSIXLY_CORRECT'} = 1;}
use v5.14;
use Getopt::Long qw(:config no_ignore_case);
my $input = '';
my $output = '';
my $lines = 0;
GetOptions('i=s' => \$input, 'o=s' => \$output, 'l=i' => \$lines);
open FI, '<', $input;
my $count = 0;
my $count_file = 1;
while($count < $lines){
my $line = <FI>; #assign a single line of input to a variable
last unless defined($line);
open FO, '>>', "$output\_$count_file\.log";
print FO $line;
$count++;
if($count == $lines){
$count=0;
$count_file++;
}
}
print " done\n";
在命令行上调用脚本,例如:
(脚本名称) -i (输入文件) -o (输出文件) -l (输出文件的大小(即行数)
即使它不完全是您正在寻找的东西,我希望它会给您一些想法。:)