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

Shell et commandes GNU Discussion :

Optimisation shell script


Sujet :

Shell et commandes GNU

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 2
    Par défaut Optimisation shell script
    Bonjour!

    J'ai commencé il ny 'a pas longtemps à réaliser de petits scripts shells et jusque là j'ai réussi à créer les fonctionalités voulues en cherchant sur votre forum et avec mon ami google mais je cherche désormais à "optimiser" mon script, ce qui est moins évident...

    Je m'explique : mon but est de rechercher une dizaine d'éléments (figurant une fois par ligne) dans un très gros fichier texte (30 à 100 mo !) et d'afficher le nombre de leur occurences :
    - disons que je cherche les chaînes :
    chaîne1 , chaîne2, .... , chaîne10
    - je crée les variables :
    nbOccur1='grep "chaîne1" monGrosFichier | wc -l'
    nbOccur2='grep "chaîne2" monGrosFichier | wc -l'
    ...
    nbOccur10='grep "chaîne10" monGrosFichier | wc -l'
    - et je les sors les résultats successivement ainsi :
    echo "$nbOccur1" >> fichierSortie.txt
    echo "$nbOccur2" >> fichierSortie.txt
    ...
    echo "$nbOccur10" >> fichierSortie.txt

    Mon soucis c'est que ce script que je fais boucler sur plusieurs fichiers texte assez gros ( > 30 Mo ) se fait en bcp trop de temps (pas loin d'une heure).
    Les données se trouvent, ca peut peut-être exliquer cela mais j'aurai voulu avoir votre avis sur une éventuelle optimisation de mon script. Je me demande s'il n'est pas possible de faire la recherche simultanément des 10 chaînes en ne parcourant le texte qu'une seule fois, au lieu de le parcourir 10 fois avec la recherche d'une seule chaîne... et pensez vous que cela prendrait moins de temps?

    Merci d'avance pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    perso, je me tournerais vers perl... afin de pouvoir lire ligne par ligne

    sinon en shell, je verrais bien cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    nbOccur1=0
    # idem pour les autres
    FILE=`cat ${FILEPATH}`
    for WORD in $FILE
    do
        if [${WORD} -eq ${chaine1}]
        then
            LET nbOccur1=nbOccur1+1
        fi
        # idem pour les autres
    done
    echo "$nbOccur1" >> fichierSortie.txt
    #idem pour les autres

    mais ce sera très gourmand en mémoire
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Citation Envoyé par gorgonite
    perso, je me tournerais vers perl... afin de pouvoir lire ligne par ligne
    Ou bien avec awk
    Ou tout simplement la commande read du shell associée à sed.

    Désolé je n'ai pas le temps de me pencher plus dessus, il est temps de quitter le travail
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    Citation Envoyé par al1_24
    Ou bien avec awk
    Ou tout simplement la commande read du shell associée à sed.

    Désolé je n'ai pas le temps de me pencher plus dessus, il est temps de quitter le travail

    possible...
    mais dès que ça devient trop compliqué, en script système, je me tourne vers perl, puis faire les binaires en c... question de puissance de langage et de rapidité
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 2
    Par défaut
    Merci beaucoup pour vos réponses !

    Je vais implémenter vos solutions et tester sur un fichier d'essai l'efficacité des algorithmes.
    Sinon pour le Perl, j'avoue que je ne sais pas trop ce que c'est, est-ce aussi abordable que le shell script? L'avantage pour moi avec le shell script étant de pouvoir les lancer depuis windows sur le serveur unix via un .bat sans problème de droit ou autres... En tout cas je vais étudier la question.

    Je vous tiens au courant

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Pour optimiser un shell script, une bonne solution peut consister à regarder les options des commandes utilisées.

    Par exemple, tu peux tout à fait remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep "fhdjsqkfhk" fichier | wc -l
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -c "fhdjsqkfhk" fichier
    ce qui t'évite une indirection
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Le but est d'essayer de ne parcourir qu'une seule fois tout le fichier. Awk fera l'affaire, en une seule passe.

    script wc.awk
    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
    # compte nombre d'occurences d'une série de mots
    # utilisation : awk -f wc.awk fichier.a.tester
     
    BEGIN {
        mots[1] = "exemple"
        mots[2] = "programme"
    }
     
    {
        for (i in mots)
            if (index($0, mots[i]))
                wc[i]++
    }
     
    END {
        for (i in mots)
            print "Le mot: ", mots[i], " apparaît ", wc[i], "fois"
    }

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Par défaut
    avec egrep pour ne lire qu'une seul fois le(s) fichiers et un ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    egrep 'chaine1|chaine3|chaine3' fic1 ...

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    grep ne comptera, tout au plus, que le nombre de lignes où au moins un des mots est présent (option --count) mais ne présentera pas de comptage séparé par mot.

    De toute façon, il a l'air d'avoir disparu de la circulation, notre posteur!

Discussions similaires

  1. [MySQL] Optimisation de scripts PHP/MySQL
    Par DgG dans le forum PHP & Base de données
    Réponses: 368
    Dernier message: 20/11/2013, 18h59
  2. Optimisation lecture fichier via un shell script
    Par macleod dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 31/07/2007, 12h46
  3. [MySQL] [Script]Optimisation de scripts Php/MySQL (2)
    Par copy dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 27/08/2004, 08h33
  4. Parser une chaine en shell script
    Par Gogoye dans le forum Linux
    Réponses: 10
    Dernier message: 19/07/2004, 17h49
  5. Retour de requete postgresql / Shell Script
    Par doohan dans le forum Requêtes
    Réponses: 3
    Dernier message: 26/06/2003, 18h07

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