[ksh]Optimiser la lecture de gros fichiers gz.
Bonjour, je dois faire une recherche pour 31 fichiers d'archives du mois d'octobre qui sont compressés. Mon script marchait bien dans mes tests avec un petit fichier, mais lorsque je roule pour les 31 fichiers de 10 meg chaque, c'est énormément long !
Je suis pas un as en Ksh, alors comment pourrais-je sauver du temps quand on sait que chaque fichier contient 300 000 lignes lorsque décompressé ?
Voici le pseudo du code :
> Je fais un gunzip -c sur tous les fichiers du mois d'octobre et pour chaque ligne lue, si la ligne contient la valeur 2000, je place dans un compteur le montant et la quantité d'usage que je garde à la fin dans un fichier donné.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| integer ttlQtyUsage=0
integer ttlAmount=0
gunzip -c usage-2008-10-[0-9][0-9].gz | while read line
do
typeUsageRead=`echo $line|cut -c69-72`
if [ $typeUsageRead = "2000" ]; then
typeset -i qtyUsageRead=`echo "$line"|cut -c270-277`
typeset -i amountRead=`echo "$line"|cut -c306-313`
ttlQtyUsage=$ttlQtyUsage+$qtyUsageRead
ttlAmount=$ttlAmount+$amountRead
fi
done
print "$ttlQtyUsage,$ttlAmount" >> monfichier.txt |
Est-ce qu'il y a moyen de faire mieux et plus rapidement ?
Merci
[perl] La force de la commande "unpack"
Et voilà, j'ai trouvé une solution Perl : Unpack ... c'est assez efficace.
Admettons le fichier toto.txt contenant 3 millions de records ainsi :
20000000000500000200
20000000000200000250
20000000000100000300
20000000000400000050
...
et le code perl semblable à ceci :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
#!/usr/bin/perl
$fileName = "toto.txt";
##
#Le template pour aller chercher les 4 premier caractères,
# les 8 prochains et 8 final.
##
$template = "a4 a8 a8";
open (CONFIGFILE, $fileName) or return 0;
while (<CONFIGFILE>) {
($typeUsage,$qty,$amnt) = unpack($template, $_);
if ($typeUsage eq "2000")
{
$ttlQty+=$qty;
$ttlAmnt+=$amnt;
}
}
close CONFIGFILE;
print "Result - Qty:",$ttlQty,", Amount:",$ttlAmnt,"\n"; |
En gros, ca fait le travail, et en moin d'une minute...
D'accord, c'est un script perl dans un post KSH... désolé... mais au moins ya une solution disponible pour tous...
Est-ce que je devrais faire un post bidon auto résolu dans la section perl selon vous ?