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 :

[PERL/MYSQL] Temps de process interminable !!


Sujet :

SGBD Perl

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut [PERL/MYSQL] Temps de process interminable !!
    Bonjour à tous,
    Voilà mon souci. Je traite un fichier d'environ 7000 lignes. Pour chaque ligne je compare une donnée de la ligne à qui constitue une donnée unique. Si cette donnée est présente dan sma base de donnée, j'update les champs de l'enregistrement correspondant, sinon, j'insère un nouvel enregistrement.
    Voilà mon 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    #!c:\perl\bin\perl.exe
    ####### Packages #######################
    use TX2::BD;
    use TX2::Tools;
    use DBI;
    $start=&TX2::Tools::GetDate('français');
    print "Start: $start\n";
    ########################################
    ####### Variables ######################
    $TrRcvDoc=".\\TRRCVDOC.txt";
    $table='trrcvdoc';
    $nbinsertion=0;
    $nbupdate=0;
    ########################################
     
    open(TRRCVDOC,$TrRcvDoc) or die "Erreur ouverture $TrRcvDoc $! \n";
    @TRRCVDOC=<TRRCVDOC>;
    close (TRRCVDOC);
    @newtab=map{ [substr($_,0,6),
                      substr($_,6,5),
                      substr($_,22,6),
                      substr($_,28,5),
                      substr($_,33,6),
                      substr($_,39,5),
                      substr($_,44,14),
                      substr($_,58,14),
                      substr($_,72,20),
                      substr($_,92,1),
                      substr($_,93,1),
                      substr($_,94,5),
                      substr($_,120,35),
                      substr($_,155,35),
                      substr($_,190,20),
                      substr($_,210,1),
                      substr($_,211,6),
                      substr($_,217,3),
                     ] } @TRRCVDOC; 
     
    $dbh=&TX2::BD::Connexion();
     
    foreach(my $i=0;$i<=$#newtab;$i++)
    {
        $req=$dbh->prepare("SELECT DATE_CREATION_DOC from trrcvdoc WHERE NUM_MESSAGE=\'$newtab[$i][8]\'");
        $req->execute();
        my $res=$req->fetchrow_array();
        $req->finish();
        if ($res ne "")
        {
              &TX2::BD::UPDATE($dbh,$table,'NUM_MESSAGE',$newtab[$i][8],'CODE_STATUT_1',$newtab[$i][9]);
              $nbupdate++;
        }
        else
        {
              $insert="INSERT INTO trrcvdoc VALUES ('',";
              for(my $j=0;$j<=16;$j++)
              {
                  $insert.="\'".$newtab[$i][$j]."\',";
              }
              $insert.="\'".$newtab[$i][17]."\')";
              $dbh->do($insert);
              $insert="";
              $nbinsertion++;
        }
     
    $k++;
    }
    &TX2::BD::Deconnexion($dbh);
    $end=&TX2::Tools::GetDate('français');
    print "End: $end\nDONE: $nbinsertion insertion(s) -- $nbupdate update(s)\n";
    Et bien, ce processus se fait en plus de 6 minutes prends 100% de mon UC.
    Machine: DELL Latitude D600
    Processeur: intel xeon 1,6ghz
    RAM: 512 Mo
    Version Perl: 5.8.6
    php myadmin 2.6.1


    Y a t'il un problème dan mon code pour que ce soit aussi long ? car il y a vraiment très peu d'enregistrement dans ma base, 10000 tout au plus pour l'instant !!
    tout le monde est d'accord pour critiquer la pensée unique

  2. #2
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Salut

    J'ai regardé ton code, à priori, il est bon. En fait, je me pose plus des questions pour ta base. Tu dis qu'elle contient que 10000 lignes et que c'est peu. Euuh, 10000, ça commence à être conséquent ! Je procéderais à une étape d'optimisation avec l'indexation de tes tables ainsi qu'une optimistation de tes requêtes (commande [EXPLAIN de MySQL). Je te recommande aussi de voir auprès de nos collègues du forum MySQL de developpez.com.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    D'accord j'ai posté sur le forum mysql. Merci en tout cas pour ton coups d'oeil au script perl

    PS: Je croyais vraiment que 10000 enregistrement, c'était minable.
    tout le monde est d'accord pour critiquer la pensée unique

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Je me permets de fermer ce post, et de marquer résolu bien que ça ne concernait pas perl.
    Le problème était un index sur mon axe de recherche (celui sur lequel je fais le select).
    Avec cette modification, je passe d'un temps de traitement de 7minutes environ à ............................................................ 4 secondes.
    tout le monde est d'accord pour critiquer la pensée unique

  5. #5
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Ok, j'étais certain que c'était plus un problème d'optimisation de la base.
    Comme quoi, j'ai encore de beaux restes

    @++

    GLDavid, qui se lance des fleurs.
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    En tout cas, merci de m'avoir dirigé vers eux. y a pas à dire, l'équipe de développez.com est aussi compétente dans tous les domaines....
    Et nous est, en tout cas, m'est indispensable.
    tout le monde est d'accord pour critiquer la pensée unique

  7. #7
    Membre habitué
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Points : 129
    Points
    129
    Par défaut
    Bonjour,

    je me permets de faire remonter ce sujet car j'ai le même genre de problème, sauf que je ne peux pas optimiser coter MySQL.

    Je m'explique : j'ai une table contenant 66000 lignes environs. je dois extraire 2 champs pour toutes les lignes de cette table et les écrire dans un fichier texte.

    voici mon 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
    26
    27
    28
    29
    30
    31
    32
    33
     
    ##Ouverture en écriture du fichier de sortie
    	my $nom_fichier = "dico_aliases_".$espece.".txt";
    	my $fichier_sortie="/Users/admin/Scripts_math/text_mining/".$nom_fichier;
    	open(ALIAS,">$fichier_sortie") or die "Impossible de creer le fichier $fichier_sortie\n";
     
    	#construction du nom de la table contenant les genes et aliases dans la BD
    	$table = $espece."_transcript_go";
     
    	#requete récupération des aliases de tous les genes product
    	my $requete="SELECT DISTINCT gene_product, gene_product_aliases FROM $table;";
     
    	#prépare la requête sql
    	my  $res = $dbconnect_loc->prepare($requete);
     
    	#exécution de la requête sql
    	$res-> execute() || die "pb de selection : $DBI::errstr";
     
    	print (ALIAS "Genes\t||\tAliases \t|\n");
     
    	while ((@aliases = $res -> fetchrow_array) && $nb_lignes)
    	{
    		print (ALIAS $aliases[0]."\t||\t".$aliases[1]."\t|\n");
    		$nb_lignes --;
    	}
     
    	close (ALIAS);
     
    	#spécifie la fin de la requête
    	$res-> finish();
     
    	#déconnection à la base de données
    	$dbconnect_loc->disconnect();
    Je ne sais pas comment faire pour optimiser le temps de génération du fichier (d'autant plus que je dois le faire 3 fois sur trois tables différentes d'environ la même taille...).

    Pensez vous que ça puisse se faire en perl, ou moitier en perl moitié en SQL peut être... j'avoue ne pas avoir d'idées...

  8. #8
    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 : 498 771
    Points
    498 771
    Par défaut
    ouvre un autre post s'il te plait et je déplacerais tes messages.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/10/2006, 16h25
  2. perl + mySQL
    Par wiss20000 dans le forum SGBD
    Réponses: 1
    Dernier message: 23/08/2006, 12h35
  3. [mysql] Temps d'exécution + ALGO
    Par aymen dans le forum Langage SQL
    Réponses: 6
    Dernier message: 17/03/2006, 09h58
  4. Réponses: 1
    Dernier message: 07/10/2005, 09h24
  5. [MySql] temps de traitement interminable
    Par LE NEINDRE dans le forum Requêtes
    Réponses: 8
    Dernier message: 08/07/2005, 15h14

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