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

Langage Perl Discussion :

system () ne revient pas ?


Sujet :

Langage Perl

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 112
    Par défaut system () ne revient pas ?
    Bonjour

    j''invoke une commande csh dans un script perl, mais voila mon script plante et léxecution ne s'arrete pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	else
    		{
    		($layer)= ($line =~ m/LAYER\D+(\d+)/);
    		$line=<NXPGDS>;
    		($datatype)= ($line =~ m/DATATYPE\D+(\d+)/);
    		system ("csh -c 'echo alo > result'");
    		}		
    }
     
    close(NXPGDS);

    bon le else est enclosé dans un while aussi

    sans cet appel a csh le scipt perl marche a merveille
    si je deplace mon appel a system a la fin du fichier, ca marche egalement
    mais si je le met a línterieur du bloc else ca ne marche plus et le script ne rends plus la main.

    je suis sous csh et je fait just ./MonScript.pl

    voila si pouvez m'aider a regler mon probleme

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 112
    Par défaut
    okay, je vuiens de decouvrir ce qui se passe
    en fait le fichier est long et donc je fait appel plusieur fois a la fonction system
    c'est drole les premiers appel de system sont super rapide, mais au bout de certaine iterations l'appel devient tres lent , est ce que quelqu'un saurait a quoi c'est du ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 112
    Par défaut
    okay pour info, je fais donc 18000 fois appel a cette fonction system , et le temps quélle prends augmente avec le temps pour une raison que j'ignore pour le moment ??
    je voulais en fait beneficier de la fonction grep du c-shell , est ce que vous connaissez un equivalent de grep du coté perl qui m'eviterait cet appel a system
    je sais quíl y a le grep de perl , mais il fait pas la meme chose que le grep de csh
    je veux juste recuperer une ligne qui contient une certaine expression reguliere d'un fichier que je navait pas utilisé jusqua la , sans devoir l'ouvrir

  4. #4
    Membre expérimenté
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Par défaut
    Bonjour,

    Pour que l'on puisse t'aider il nous faudrait plus d'info, quelle expression cherche tu, dans quel fichier, quel est son format...
    Affiche-nous aussi ton shell script.

    Lilian.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 112
    Par défaut
    okay merci Lilian pour ta reponse, dsl je vais mieux expliquer mon problem

    donc mon fichier dórigine ressemble a ca

    BGNSTR; # Begin of structure
    CREATION {70-1-1 1:0:0}; # creation time
    LASTMOD {109-2-12 12:51:15}; # last modification time
    STRNAME M7M6QDC$$43008064;

    BOUNDARY;
    LAYER 37;
    DATATYPE 40;
    XY 5;
    X: -3350; Y: -25910;
    X: 3350; Y: -25910;
    X: 3350; Y: 25910;
    X: -3350; Y: 25910;
    X: -3350; Y: -25910;
    ENDEL;

    BOUNDARY;
    LAYER 36;
    DATATYPE 40;
    XY 5;
    X: -3350; Y: -25910;
    X: 3350; Y: -25910;
    X: 3350; Y: 25910;
    X: -3350; Y: 25910;
    X: -3350; Y: -25910;
    ENDEL;

    BOUNDARY;
    LAYER 56;
    DATATYPE 40;

    XY 5;
    X: 2970; Y: 25470;
    X: 3330; Y: 25470;
    X: 3330; Y: 25830;

    donc ce que je veux faire c'est lire ce fichier, et remplacer les deux lignes que j'avais mise en rouge gras et mettre la sortie dans fichier disons outfile.

    ici en l'occurence je veux remplacer LAYER 56 DATATYPE 40
    par LAYER 55 DATATYPE 78


    en fait les nouvelle valeurs de Layer et datatype je ne les connais , je les lis a partir d'un autre fichie qui ressemble a ca


    OD boundary 6 26 28 88
    OD mask 6 81 76 120
    OD pin 6 82 24 45
    OD net 56 40 55 78
    OD noprocessing 6 90 32 36

    donc ici en l'occurence , comme je l'ai mis en rouge gras layer 56 datatype 40 doit etre remplacé par layer 55 datatype 78 (la ligne OD net)


    donc ce que j'ai pensé faire c'est ca

    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
    open(NXPGDS, "./Bondpad7Metal_nxp.txt") or die ("$!");
    open(STGDS, ">./Bondpad7Metal_st.txt") or die ("$!");
     
     
    select(STGDS);
     
    while (defined($line=<NXPGDS>))
    {
    	if ($line !~ m/LAYER/)
    		{
    		chomp($line);
    		print("$line\n");
    		}
    	else
    		{
    		($layer)= ($line =~ m/LAYER\D+(\d+)/);
    		$line=<NXPGDS>;
    		($datatype)= ($line =~ m/DATATYPE\D+(\d+)/);
    		system ("csh -c 'echo alo '");
    		}		
    }
     
    close(NXPGDS);
    close(STGDS);
    j'ouvre le premier fichier, je cherche les lignes layer et datatype, je recupere les valeur de layer et de datatype ,
    et la je fait appel a system csh pour faire un grep sur le 2eme fichiers qui specifie les nouvelles valeur.

    je fait par exemple system ("csh -c 'grep $layer $datatype mappinglayertable.txt'");

    et je recupere la ligne OD net 56 40 55 78

    bon je suis newbie a perl, je ne lútilise que ponctuellement donc je ne sais pas comment recuperer apres la ligne rendu par grep ni si les valeur $layer $datatype seront correctement prix en compte par la commande system


    c'est pour ca que dans mon script j'ai mis un simple echo juste pour tester, et c'est la que ca a foiré pour moi , parce que dans mon fichier de base j ái 18000 lignes qui contiennent Layer datatype, donc je devrais faire appel a system 18000 fois,

    voila merci de votre patience

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 112
    Par défaut
    okay probleme resolu
    j''ouvre le fichier de mapping , et je cree une hash table de la forme
    key: layerorigine_datatypeorigine
    value: layernew_datatypenew
    du coup plus besoin de faire appel a system

    par contre si quelquún pourrait m'expliquer pourquoi avec le temps les appels system ralentissent, ou me proposer une solution avec l'idee que j'avais utilisé au debut je suis preneur

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Citation Envoyé par MohEllayali Voir le message
    je voulais en fait beneficier de la fonction grep du c-shell , est ce que vous connaissez un equivalent de grep du coté perl qui m'eviterait cet appel a system
    je sais quíl y a le grep de perl , mais il fait pas la meme chose que le grep de csh
    je veux juste recuperer une ligne qui contient une certaine expression reguliere d'un fichier que je navait pas utilisé jusqua la , sans devoir l'ouvrir
    Je ne comprends pas bien le désir que tu as "de ne pas ouvrir le fichier"...
    Si ce n'est pas ton script perl qui ouvre le fichier pour appliquer le grep, ce sera la fonction grep de ton shell...

  8. #8
    Membre expérimenté
    Homme Profil pro
    Gérant infopsylon
    Inscrit en
    Juin 2010
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Gérant infopsylon
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 215
    Par défaut
    MohEllayali,

    Pendant l'execution de ton programme perl, si j'ai bien compris, ca dure un certain temps (18000 lignes); comment se comporte l'usage de la ram et et la memoire virtuelle ?
    A chaque fois que tu fais appel à csh -c .. tu demandes l'ouverture d'un nouveau shell fille ; je me demande si la mémoire est libérée à la fin de system(), ou à la fin de l'execution du programme perl ...?

    Lilian.

    EDIT : Je me pose moi aussi la même question que Philou

  9. #9
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Citation Envoyé par lilian_h Voir le message
    EDIT : Je me pose moi aussi la même question que Philou
    D'autant que l'usage de open/grep en perl ne créerait pas l'overhead (et éventuellement la consommation mémoire) de la solution shell/grep (charger un shell, charger grep, ...).

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 112
    Par défaut
    Bonjour a tous

    Citation Envoyé par Philou67430
    Je ne comprends pas bien le désir que tu as "de ne pas ouvrir le fichier"...
    Si ce n'est pas ton script perl qui ouvre le fichier pour appliquer le grep, ce sera la fonction grep de ton shell...
    en fait comme je disais je suis newbie a Perl , donc je ne voulais pas ouvrir l'autre fichier et le percourir a la recherche de ma chaine par peur/faineantise, et comme il ya un grep tout pret a l'usage en c-shell .... tu me diras pourtant t'utilises bien perl pour parcourir ton premier fichier .. oui , c'est vrai : je suis con !!!


    Citation Envoyé par lilian_h
    Pendant l'execution de ton programme perl, si j'ai bien compris, ca dure un certain temps (18000 lignes); comment se comporte l'usage de la ram et et la memoire virtuelle ?
    okay merci, mais je fais ca comment , ya une commande pour le faire ? ou bien je cree un nouveau un nouveau shell et je tape top tout simplement
    si c'est comme ca mon programme rame comme hier et la colonne %cpu affiche 0.7% et ca reste stable tout le temps , %mem est a 0% tout le temps
    la colonne VIRT máffiche 78868 tout le temps ca change pas

    voici une image, le programme sappelle test.pl, a la 5eme ligne


    bon ici %cpu =0.3 , mais si je le laisse suffisement de temps il monte jusquá 0.7 et se stabilise


    voila ce que ca donne 5 minutes plus tard , le programme rame toujours


  11. #11
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Un grep en perl, est presque aussi simple qu'en shell, et bien plus puissant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    open my $FIC, "<", "fichier.txt";
    my ($new_layer, $new_datatype);
    while (<$FIC>) {
      $new_layer = $_ if /$layer_regexp/;
      $new_datatype = $_ if /$data_type_regexp/;
      last if $new_layer && $new_datatype;
    }
    close $FIC;
    Et le tour est joué. Tu peux même aller jusqu'à récupérer directement la valeur numérique dans la ligne recherchée...

  12. #12
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Août 2008
    Messages : 505
    Par défaut
    Je viens de faire l'expérience ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    open($file,'<',$ARGV[0]);
    $i=0;
    while(<$file>){
    print "$i\n";
    $i++;
    system("csh -c 'echo lala >/tmp/toto'");
    }
    Et puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cat /var/log/messages /var/log/messages /var/log/messages >> /tmp/messages 
    perl test-system.pl /tmp/messages
    Je n'observe aucun ralentissement. Toutefois, comme l'on dit les autres le fait de passer par un shell pour faire un grep, et qui plus, est de lancer un csh en plus, c'est très peu efficace comme méthode.
    Un ralentissement de ce type doit être lié au système, d'une manière ou une autre. Peut-être est-ce lié à un nombre maximal de descripteur de fichiers ouverts qui une fois atteint demanderait que le précédent soit bien refermé ? Difficile à dire...

Discussions similaires

  1. Réponses: 12
    Dernier message: 14/01/2019, 02h12
  2. Mon systeme ne demarre pas
    Par mudibu dans le forum Mandriva / Mageia
    Réponses: 1
    Dernier message: 23/05/2007, 17h53
  3. => System.getenv MARCHE PAS
    Par encom79 dans le forum Tomcat et TomEE
    Réponses: 15
    Dernier message: 23/02/2007, 15h11
  4. [PC Restor]La réinstallation de mon systeme ne marche pas
    Par mamiberkof dans le forum Windows XP
    Réponses: 2
    Dernier message: 29/10/2006, 20h19
  5. Réponses: 13
    Dernier message: 31/08/2005, 15h03

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