IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

[ksh]Optimiser la lecture de gros fichiers gz.


Sujet :

Linux

  1. #1
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 23
    Par défaut [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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par xodblux Voir le message
    Est-ce qu'il y a moyen de faire mieux et plus rapidement ?
    Je ne crois pas. J'ai bien examiné ton code mais mis à part remplacer [0-9][0-9] par [0-3][0-9] (vu qu'octobre n'a que 31 jours) et replacer "= 2000" par "-eq 2000", je ne vois pas ce que tu peux améliorer. Le shell est un langage efficace mais bien bien lent. Moi j'ai eu à traiter un fichier composé de 7 ou 8 colonnes. Chaque ligne devait générer une ligne xml avec un chapitre pour chaque colonne. J'ai fait comme toi, à traiter ligne par ligne. Total : 40mn de traitement pour un fichier assez gros.
    Ensuite je l'ai réécrit en Python => traitement en 36sec...

    A la limite donc si tu peux envisager de porter ton code en Perl ou Python...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 23
    Par défaut
    Merci Sve@r d'avoir pris le temps de regarder mon code !

    Je vais tenter d'écrire quelquechose en perl cette semaine et je reviens là dessus, histoire d'avoir au moin une valeur ajoutée à cette discussion...

    Cependant, s'il y a un gourou de perl dans la salle qui pourrait me concocter l'équivalent en perl, ou bien un esquisse pour m'aider à démarrer, ca serait super. Merci.

  4. #4
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 23
    Par défaut [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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par xodblux Voir le message
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...
    Héhé... puissance absolue !!! Bon, quand il m'a fallu choisir un langage j'ai choisi Python mais j'aurais pu aussi prendre Perl...

    Citation Envoyé par xodblux Voir le message
    Est-ce que je devrais faire un post bidon auto résolu dans la section perl selon vous ?
    Non, tout le monde s'en fout. C'est seulement si tu as un soucis...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre averti
    Inscrit en
    Mars 2005
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 23
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Héhé... puissance absolue !!! Bon, quand il m'a fallu choisir un langage j'ai choisi Python mais j'aurais pu aussi prendre Perl...
    Non, tout le monde s'en fout. C'est seulement si tu as un soucis...
    C'est ca le problème en info, soit on se spécialise dans un langage et on devient pro dans les quelques outils qu'on se limite, soit on est généraliste et on connait juste la base pour utiliser une tonne d'outil.

    Entk, moi je ne suis pas capable de prendre un décision à savoir ce que j'aime le plus, alors ca fait que j'ai besoin de faire des tonnes de recherches sur le net pour apprendre les meilleurs outils et les meilleures recettes pour faire la job... C'est pas ce qui est le plus rapide, mais je fais toutes les job qu'on me demande...

    Une chance qu'il y a la communauté web pour partager les connaissances ! Il n'y aurait pas autant de bon programmeurs sans elle !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Système] Lecture de gros fichiers
    Par pascalbout1 dans le forum Langage
    Réponses: 7
    Dernier message: 10/12/2007, 21h50
  2. Optimisation de lecture de gros fichier
    Par uriotcea dans le forum Windows
    Réponses: 3
    Dernier message: 23/11/2006, 19h00
  3. [Perf] Optimiser la lecture d'un fichier de taille > 2 m
    Par sacofan dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 22/07/2005, 13h25
  4. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 4
    Dernier message: 05/02/2003, 08h54
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo