IHS 로그 파일을 구문 분석하기 위해 멀티 스레딩을 사용하고 있습니다. 각 파일 핸들마다 별도의 스레드를 할당하고 500 개의 오류 수를 계산합니다.Perl 스레드를 사용하여 2 차원 해시 공유
sub parse_file {
my $file = shift;
my @srv = split /\//,$file;
my $filename = $srv[$#srv];
my $TD = threads->tid();
$sem->down;
print "Spawning thread $TD to process file \"$filename\"\n" if ($verbose);
$rTHREADS++;
$TIDs{$TD} = 1;
$sem->up;
open (FH, "$file") || die "Cannot open file $file $!\n";
while (<FH>){
if (/^(\d{13}).*?(\d{3}) [\-0-9] \d+ \d+ \//){
my $epoch = $1/1000;
my $http_code = $2;
my $ti = scalar localtime($epoch);
$ti =~ s/(\d{2}):\d{2}:\d{2}/$1/;
if ($http_code eq '500'){
unless (exists $error_count{$ti} && exists $error_count{$ti}{$http_code}){
lock(%error_count);
$error_count{$ti} = &share({});
$error_count{$ti}{$http_code}++;
}
}
}
}
close (FH);
$sem->down;
print "Thread [$TD] exited...\n" if ($verbose);
$rTHREADS--;
delete $TIDs{$TD};
$sem->up;
}
문제는 출력 (% http_count)이 사용한 인쇄 덤퍼 모양이다 :
$VAR1 = 'Mon Apr 30 08 2012';
$VAR2 = {
'500' => '1'
};
$VAR3 = 'Mon Apr 30 06 2012';
$VAR4 = {
'500' => '1'
};
$VAR5 = 'Mon Apr 30 09 2012';
$VAR6 = {
'500' => '1'
};
$VAR7 = 'Mon Apr 30 11 2012';
$VAR8 = {
'500' => '1'
};
$VAR9 = 'Mon Apr 30 05 2012';
$VAR10 = {
'500' => '1'
};
$VAR11 = 'Mon Apr 30 07 2012';
$VAR12 = {
'500' => '1'
};
$VAR13 = 'Mon Apr 30 10 2012';
$VAR14 = {
'500' => '1'
};
$VAR15 = 'Mon Apr 30 12 2012';
$VAR16 = {
'500' => '1'
};
작업은 79초
항상 1로 설정 될 때마다 최신의 500 카운트했다. 적절한 수를 표시 할 수 없습니다. 그것은 성명을 $error_count{$ti} = &share({});
것 범인이지만 나는 그것을 해결하는 방법을 잘 모르겠습니다.
감사합니다.
해시를 많은 별도의 스칼라 값으로 덤프하지 않으려면'print Dumper (\ % http_count) '를 사용하십시오. – Borodin
고마워! 여기에있는 모든 의견은 매우 유용합니다! – waltz777