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

SGBD Perl Discussion :

pb occupation memoire : requete dans boucle infinie


Sujet :

SGBD Perl

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 1
    Points
    1
    Par défaut pb occupation memoire : requete dans boucle infinie
    Bonjour,

    J'ai un script Perl qui contient un dans lequel je fais quelques requetes ultra simples sur une base Oracle
    le probleme est que le script augmente sans cesse en occupation memoire (20Mo au lancement, +4Ko à chaque itération de boucle while)
    voici un petit aperçu du code :

    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
    25
    while( 1 )
    {			
    	my $dbh = DBI->connect("dbi:Oracle:$basepilote","$userpilote","$pwdpilote");
    	if($dbh)
    	{
    		print "Connecte a la base $nompilote\n" if $debug;
    	}
    	else
    	{
    		print "Connection a la base $nompilote IMPOSSIBLE\n" if $debug;
    		sleep(5);
    		next;
    	}
     
    		my $sel3 = $dbh->prepare("SELECT valeur_param FROM param_generique WHERE libelle_param='NOEUD_ACTIF'");
    		$sel3->execute || die "ERROR - probleme de select : $DBI::errstr";
    		my $noeud = $sel3->fetchrow_array;
    		$sel3->finish;
     
                              print "noeud = $noeud\n";
     
    		$dbh->disconnect;
    		print "Deconnecte de la base $nompilote\n" if $debug;
     
    }
    je ne comprend pas pourquoi ça monte comme ça en memoire... quelqu'un aurait-il une idée ?? merci par avance
    Julien

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Pourquoi se connecter et se déconnecter dans le while. Tu pourrais déjà le faire en dehors de la boucle infinie.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    En fait mon script est un service windows (avec Win32:aemon), donc j'aimerais éviter d'avoir une connection permanente à la base...

    ceci dit j'ai essayé de faire le connect et disconnect en dehors de la boucle infinie, et bizarrement c'est pire !! En 1 minute on passe de 20Mo à 50Mo !!!

    j'ai aussi remarqué que le phénomène est surtout visible dès que je mets 2 requetes dans le while...

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    , en effet, c'est bizarre

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Essaye 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
    while (1) {
      my $dbh = DBI->connect( "dbi:Oracle:$basepilote", $userpilote, $pwdpilote );
      unless ($dbh) {
        print "Connection a la base $nompilote IMPOSSIBLE\n" if $debug;
        undef $dbh;
        sleep(5);
        next;
      }
     
      print "Connecte a la base $nompilote\n" if $debug;
     
      my $sel3 = $dbh->prepare("SELECT valeur_param FROM param_generique WHERE libelle_param='NOEUD_ACTIF'");
      $sel3->execute || die "ERROR - probleme de select : $DBI::errstr";
      my $noeud = $sel3->fetchrow_array;
      $sel3->finish;
     
      print "noeud = $noeud\n";
     
      $dbh->disconnect;
      print "Deconnecte de la base $nompilote\n" if $debug;
     
      undef $dbh;
      undef $sel3;
    }
    Même si je doute que ça ne change quelque chose vu que perl détruit normalement les variables après chaque itération.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    j'avais déjà essayé, sans conviction, les undef... pas mieux
    j'ai aussi essayé de déclarer toutes les variables en dehors du while, pas mieux

    j'ai laissé tourner le script depuis 2 jours, c'est monté au max à 170Mo, et en ce moment même il est à 65Mo... ce qui me surprend aussi puisque Perl ne rend pas au système la mémoire qu'il alloue

  7. #7
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Sinon, au lieu d'en faire un daemon, pourquoi ne pas lancer le script toutes les minutes par exemple.

  8. #8
    Membre actif

    Profil pro
    Inscrit en
    Août 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 156
    Points : 211
    Points
    211
    Par défaut
    Attention, sous Windows, la gestion mémoire est des fois bizarre, j'ai déjà observé que sur du Windows 2003 Server,
    un programme java paramétré avec 64Mega de RAM maxi, qui fonctionne bien, qui libère la mémoire comme il faut (testé sous un Unix, débuggé sous le Windows), occupe toujours plus de mémoire.
    L'"utilisation mémoire" du gestionnaier de tacjes est donc des fois erronnée, la "taille MV" elle ne fait qu'augmenter et ne peut jamais être libérée.

    J'ai finis par mettre un redémarrage le WE du batch... :-(

    C'est ptêt un problème similaire, Perl libère bien la mémoire, mais pas l'OS.

    Tu peux tester sous un Linux ou n'importe quel autre OS ?

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    je suis aussi sur 2003 server ! pas de linux sous la main pour tester, je me suis résigné !
    j'ai laissé tourné le script, qui monte à 170Mo max, et qui redescend d'un coup à 80Mo pour remonter ensuite etc...

  10. #10
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Faut pas trop chercher , firefox a le même souci est fait ramer souvent ton ordinateur . C'est le mystère Windows.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 118
    Points
    118
    Par défaut
    Bonjour, je rebondi sur ce sujet car j'ai plus ou moin le même problême: j'ai penser à la solution du scripts qui s'execute toutes les x minutes mais le problème est que je ne sais pas comment la mettre en place. En faite je dois faire un programme qui se reveil pour faire une injéction dans la BD toute les x minutes: alors faut-il mieu faire une boucle infinie qui dort le reste du temps ou un programme qui s'éxecute au bon moment? pour la deuxième solution, comment est-ce possiblie sous Unix? Merci d'avance pour vos réponse

  12. #12
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 118
    Points
    118
    Par défaut
    Merci du renseignement, je vais essayer

  14. #14
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    re

    j'ai isolé le problème, qui vient de la methode "prepare"
    voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    my $dbh = DBI->connect("dbi:Oracle:$base","$user","$pwd");
    sleep(5);
    while($i<100000)
    {
      $i++;
      my $sel1 = $dbh->prepare("SELECT valeur FROM param WHERE libelle='ACTIF'");
      $sel1->finish;
    }
    sleep(5);
    au lancement le script monte à 14Mo mémoire
    après la pause de 5 secondes, il monte à 45Mo en 30 secondes... et bien sûr continue de monter à raison de 1Mo par seconde jusqu'à fin du while


    quelqu'un aurait-il une idée ? qui pourrait reproduire ça chez lui et confirmer ?
    merci par avance

  15. #15
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    normal que ça rame. Ta façon de faire n'est pas bonne car tu crée et exécute ta requête x fois pourtant elle est identique et c'est juste la valeur qui change. Il faut utiliser les placeholders comme je l'explique dans ma documentation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/perl
    my $dbh = DBI->connect("dbi:Oracle:$base","$user","$pwd");
    sleep(5);
     
    my $sel1 = $dbh->prepare("SELECT valeur FROM param WHERE libelle = ? ");
    while ( $i < 100000 ) {
      $i++;
      # ...
    }
    $sel1->finish;
    sleep(5);

  16. #16
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    effectivement je n'ai plus le problème avec utilisation des placeholders ! merci
    par contre ceci implique une connection permanente à la BDD (connect hors du while(1))... comment faire si je veux me connecter/deconnecter à chaque tour de boucle ?

  17. #17
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Bah, faut nous montrer ton script et qu'on sache concrètement ce que tu veux faire

  18. #18
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    finalement je vais rester connecté en permanence à la base...
    par contre j'ai l'impression que les placeholders ne fonctionnent pas avec les procédures stockées, voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $dbExploit = DBI->connect( "dbi:ODBC:$baseExploit", $loginExploit, $pwdExploit ) or die "Unable to connect $baseExploit : $DBI::errstr\n";
    $psExploit2 = $dbExploit->prepare("[$baseExploit].[dbo].[sp_InsertRelance] ?");
    ...
    $psExploit2->execute("$daem");
    y a-t-il une solution pour utiliser des placeholders dans ce cas ? (la base est sql server)

Discussions similaires

  1. [MySQL] Requete dans boucle et optimisation
    Par freestyle83 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 06/02/2014, 18h53
  2. fuite memoire PyList_setItem dans boucle
    Par jyjeanphi dans le forum Interfaçage autre langage
    Réponses: 13
    Dernier message: 07/04/2009, 01h10
  3. requete dans boucle
    Par mussara dans le forum Requêtes
    Réponses: 0
    Dernier message: 21/08/2007, 13h10
  4. symptome de la boucle infinie dans une requete
    Par ouam81 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/05/2005, 12h10
  5. Réponses: 15
    Dernier message: 24/05/2005, 08h34

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