Tout d'abord, un million de lignes ne sont pas du tout un énorme fichier. Un simple script Perl peut masquer un script de 2,7 millions de lignes en 6 secondes, sans avoir à trop penser à l'algorithme.
Dans tous les cas, le hash est le chemin à parcourir et, comme indiqué, il n'y a pas besoin de s'embêter avec le hachage sur une représentation entière. Si nous parlions d'un fichier vraiment énorme, alors les E/S deviendraient le goulot d'étranglement et donc la méthode de hachage devient de moins en moins pertinente au fur et à mesure que le fichier grossit. Théoriquement dans un langage comme C, il serait probablement plus rapide de hacher sur un entier que sur une chaîne, mais je doute que dans un langage adapté à cette tâche, cela fasse vraiment une différence.Des choses comme la façon de lire efficacement le fichier importeraient beaucoup plus.
code
[email protected]:~$ more hash.pl
use strict;
use warnings;
my %ip_hash;
my %product_hash;
open my $fh, "<", "log2.txt" or die $!;
while (<$fh>) {
my ($timestamp, $ip, $product) = split (/;/,$_); #To fix highlighting
$ip_hash{$ip} = 1 if (!defined $ip_hash{$ip});
if (!defined $product_hash{$product}) {
$product_hash{$product} = 1
} else {
$product_hash{$product} = $product_hash{$product} + 1;
}
}
for my $ip (keys %ip_hash) {
print "$ip\n";
}
my @pkeys = sort {$product_hash{$b} <=> $product_hash{$a}} keys %product_hash;
print "Top product: $pkeys[0]\n";
Exemple
[email protected]:~$ wc -l log2.txt
2774720 log2.txt
[email protected]:~$ head -1 log2.txt
1;10.0.1.1;DuctTape
[email protected]:~$ time perl hash.pl
11.1.3.3
11.1.3.2
10.0.2.2
10.1.2.2
11.1.2.2
10.0.2.1
11.2.3.3
10.0.1.1
Top product: DuctTape
real 0m6.295s
user 0m6.230s
sys 0m0.030s
Quand vous dites le fichier journal, vous voulez dire un fichier texte, avec un enregistrement par ligne? –
Oui, les enregistrements sont dans un fichier texte (à plat) – nowonder
Y a-t-il des nouvelles lignes séparant chaque entrée? –