非連続的にバックアップしたログをひとつのファイルにしたい。
各ログファイルは期間的に重複している。
単純に全部まとめると300MBくらい。
use strict;
use warnings;
my %mons = (
'May' => '05',
'Jun' => '06',
'Jul' => '07',
'Aug' => '08',
'Sep' => '09',
);
my $DIR = 'hogehoge/hugahuga/';
my $ALL = $DIR.q[all.txt];
open( my $all_fh, '>', $ALL ) or die( $ALL, $! );
my %all_check;
my $trex = qr{ \[ (\d+) / (\w+) / (\d+) : ([\d:]+) \s+ \+ \d+ \] }mosix;
foreach my $base ( get_dirs( $DIR, sub { -d shift } ) ) {
my $dir = qq[$DIR$base/var/log/httpd/];
foreach my $file ( get_dirs( $dir, sub { ( shift ) =~ m{^access} } ) ) {
open( my $fh, qq[$dir$file] ) or die( qq[$dir$file], $! );
while ( !eof( $fh ) ) {
my $line = scalar <$fh>;
next if $all_check{$line}++;
print $all_fh $line;
}
close( $fh );
}
}
close( $all_fh );
sub get_dirs {
my $dir = shift;
my $yield = shift;
opendir( DIR, $dir ) or die( $dir, $! );
my @dirs = grep { &$yield( $_ ) } ( grep !m{^\.\.?$}, readdir( DIR ) );
closedir( DIR );
return @dirs;
}
まずこんな感じのコードにかける。
ちなみに、このとき使用メモリは最大140MBくらい。
結果出力したファイルは60MBくらいになった。
(291313行)
後は適当にソートしてひとつのファイルにしてanalyzerにかけておしまい。
hashにガンガン値を突っ込むからメモリ的にきついかと思ってたけど、
思ったより現実的な時間で終わった。
(実ファイルの二倍ちょいのメモリ使用量って結構少ない)
なんでfindとsortとuniq使わなかったんだろうねぇ。。。
コメントする