我最近有解析每個大約6千兆字節的幾個日誌文件。緩衝是一個問題,因爲當我將STDIN分配給一個數組時,Perl會愉快地嘗試將這6千兆字節讀入內存......但是,我根本沒有可用的系統資源來完成這項工作。我提出了下面的解決方法,它只需逐行讀取文件,從而避免大量內存黑洞緩衝渦旋,否則這些渦旋會佔用我所有的系統資源。
注意:該腳本所做的全部工作是將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(輸出文件)-1-(輸出文件(即行數的大小)
即使它不完全符合你的要求,我希望它能給你一些想法。:)
你確定'cat fff | perl -e'系統(「./ 1.pl」)''打印內容?對我來說只有'貓fff | perl 1.pl'確實。 – tuxuday