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 :

pb de foreach qui se bloque toujours au même endroit.


Sujet :

Langage Perl

  1. #1
    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 : 38
    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 pb de foreach qui se bloque toujours au même endroit.
    Bonjour,

    j'ai un problème que je trouve très bizarre : une boucle foreach qui se bloque toujours au même endroit.

    voici le 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
     
    sub Recup_concepts_TFBS
    {
    	my (%concept_infos) = @_;
     
    	my ($res2, $tagID, $TF);	
    	my (%concept_TF_TFBS) = ();
     
    	&Connexion_BD();
     
    	open(RES, ">../resultats/infos_concepts_TFBS.txt") or die("Impossible d'ouvrir infos_concepts_TFBS.txt");
    	print(RES "biset_id \t|\t TF \t|\t tag_id \t|\t nb de gene ayant le TFBS \n");
     
    	foreach my $biset_id (keys(%concept_infos))
    	{
    		foreach my $tag (@{$concept_infos{$biset_id}})
    		{
    			$tagID = $tag->{"tagID"};
     			$TF = $tag->{"TF"};
     
     			my $req2 = "SELECT t.".$table."virtualtag_id, TF.gene_product 
    				FROM ".$table."_TFBS t 
    				INNER JOIN ".$table."_virtual_observed_tag v 
    				ON t.".$table."virtualtag_id = v.".$table."virtualtag_id 
    				INNER JOIN biset_cont_tag b 
    				ON b.tagID = v.".$table."observedtag_id 
    				INNER JOIN ".$table."_transcription_factor TF 
    				ON TF.tf_id = t.tf_id 
    				WHERE bisetID = $biset_id
    				AND b.tagID != $tagID
    				AND TF.gene_product = '$TF';";
     
     
    			#prépare la requête sql
    			$res2 = $dbconnect_loc -> prepare($req2);
     
    			#exécution de la requête sql
    			$res2 -> execute() || die("pb de selection : $DBI::errstr");
     
     
    			my $rows = $res2 -> rows; #compte le nb de lignes renvoyées par la requete
     
    			$concept_TF_TFBS{$biset_id} -> {$tagID}  = $rows;
    			print(RES "$biset_id \t\t|\t $TF \t\t|\t $tagID \t|\t $rows\n");
     
    		}
    	}
    	close(RES);
     
    	#spécifie la fin de la requête
    	$res2 -> finish();
     
    	#deconnexion de la base
    	$dbconnect_loc ->disconnect();
     
    	return %concept_TF_TFBS;
    }
    cela dit, je pense que ça vienne du foreach : si j'enlève tout le code de la boucle interne pour mettre un print à la place, j'obtiens bien toutes les lignes attendue... Donc j'imagine que c'est lié à la requête, mais j'ai fait plusieurs tests : la requête marche bien si je la passe directement sous MySQL.

    Bref, je sais pas du tout où chercher, donc la moindre piste serait la bienvenue.

    EDIT : je peux dire que ça bloque toujours au même endroit car le fichier dans lequel j'imprime les résultats se termine toujours ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    308655 		|	 HNF4A 		|	 611040 	|	 1
    157343 		|	 HOXA7 		|	 41409 	|	 3
    288633 		|	 DBT 		|	 401805 	|	 0
    248771 		|	 CUX1 		|	 662974 	|	 0
    165342 		|	 E2F1 		|	 772883 	|	 0
    226486 		|	 SMAD4 		|	 737465 	|	 3
    60582 		|	 PEBP1 		|	 552873 	|	 0
    216759 		|	 DBT 		|	 401805 	|	 0
    20470 		|	 DBT 		|	 401805 	|	 3
    107302
    ce qui est déjà bizarre en soit car la ligne n'est pas imprimé entièrement...

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Peut-être le fichier n'a-t'il pas le temps d'être rempli entièrement. J'ai eu un problème similaire que j'avais résolu en utilisant un sleep après le print afin de laisser le temps au fichier d'être écrit. Tu peux toujours essayer.
    -- Jasmine --

  3. #3
    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 : 38
    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
    merci.

    je viens de tester ainsi :

    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
    sub Recup_concepts_TFBS
    {
    	my (%concept_infos) = @_;
     
    	my ($res2, $tagID, $TF);	
    	my (%concept_TF_TFBS) = ();
     
    	&Connexion_BD();
     
    	open(RES, ">../resultats/infos_concepts_TFBS.txt") or die("Impossible d'ouvrir infos_concepts_TFBS.txt");
    	print(RES "biset_id \t|\t TF \t|\t tag_id \t|\t nb de gene ayant le TFBS \n");
     
    	foreach my $biset_id (keys(%concept_infos))
    	{
    		foreach my $tag (@{$concept_infos{$biset_id}})
    		{
    			$tagID = $tag->{"tagID"};
     			$TF = $tag->{"TF"};
     
     			my $req2 = "SELECT t.".$table."virtualtag_id, TF.gene_product 
    				FROM ".$table."_TFBS t 
    				INNER JOIN ".$table."_virtual_observed_tag v 
    				ON t.".$table."virtualtag_id = v.".$table."virtualtag_id 
    				INNER JOIN biset_cont_tag b 
    				ON b.tagID = v.".$table."observedtag_id 
    				INNER JOIN ".$table."_transcription_factor TF 
    				ON TF.tf_id = t.tf_id 
    				WHERE bisetID = $biset_id
    				AND b.tagID != $tagID
    				AND TF.gene_product = '$TF';";
     
     
    			#prépare la requête sql
    			$res2 = $dbconnect_loc -> prepare($req2);
     
    			#exécution de la requête sql
    			$res2 -> execute() || die("pb de selection : $DBI::errstr");
     
     
    			my $rows = $res2 -> rows; #compte le nb de lignes renvoyées par la requete
     
    			$concept_TF_TFBS{$biset_id} -> {$tagID}  = $rows;
    			print(RES "$biset_id \t\t|\t $TF \t\t|\t $tagID \t|\t $rows\n");
    			sleep(1);
    		}
    	}
    	close(RES);
     
    	#spécifie la fin de la requête
    	$res2 -> finish();
     
    	#deconnexion de la base
    	$dbconnect_loc ->disconnect();
     
    	return %concept_TF_TFBS;
    }
    EDIT : ça tourne actuellement et se remplit tout doucement. Je vais voir si ça va au bout, merci

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		foreach my $tag (@{$concept_infos{$biset_id}})
    		{
    			...
    			print "...";
    			sleep(1);			
    		}
    A chaque passage dans la boucle, tu vas attendre 1 seconde. Si tu veux utiliser des fractions de secondes, tu peux utiliser le module Time::HiRes. http://search.cpan.org/~jhi/Time-HiRes-1.9719/HiRes.pm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    use Time::HiRes qw(sleep)
    ...
    sleep (0.5);
    -- Jasmine --

  5. #5
    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 : 38
    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
    ah oui, merci, ça devrait accélérer le mouvement

    EDIT : cela dit, j'ai l'impression que le premier script restait pas vraiment bloqué, mais qu'il ralentit grandement vers la fin : j'avais laissé le script original tourner pour voir, et la taille du fichier de base a bougé. J'ai cru que c'était bloqué car ça passait de 0 à 241664 en moins d'une seconde, puis ça reste comme ça pendant un bout de temps (ça vient tout juste de passer à 245760...). Peut être qu'à partir d'un certain point le terminal n'indique les changement de taille que par palier... m'enfin, tant que ça me rend des résultats à la fin

  6. #6
    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
    Tu devrais revoir la conception de ton script en utilisant des placeholders.
    Car tu recrées ta requêtes à chaque itération alors qu'il n'y a que les conditions qui changent, tu gagneras déjà beaucoup de temps.


  7. #7
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Une remarque également pour la façon dont tu passes ton argument au sous-programme, je pense qu'utiliser une référence serait mieux d'autant plus que ton tableau semble de grande taille.

    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
    Recup_concepts_TFBS(\%concept_infos);
     
    sub Recup_concepts_TFBS
    {
    	my $ref_concept_infos = shift;
     
    	foreach my $biset_id (keys(%{$ref_concept_infos}))
    	{
     
    		foreach my $tag (@{$concept_infos{$biset_id}})
    		{
     
     
    		}
    	}
    }
    -- Jasmine --

  8. #8
    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 : 38
    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
    merci beaucoup du conseil, mais c'est quoi des placeholder? et comment ça marche?

  9. #9
    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 : 38
    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
    Citation Envoyé par Jasmine80 Voir le message
    Une remarque également pour la façon dont tu passes ton argument au sous-programme, je pense qu'utiliser une référence serait mieux d'autant plus que ton tableau semble de grande taille.
    est ce que mettre la table de hashage en variable globale reviendrait au même qu'utiliser une référence?

  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
    J'ai corrigé ton code en utilisant les placeholders

    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
    sub Recup_concepts_TFBS
    {
    	my (%concept_infos) = @_;
     
    	my ($res2, $tagID, $TF);	
    	my (%concept_TF_TFBS) = ();
     
    	&Connexion_BD();
     
    	open(RES, ">../resultats/infos_concepts_TFBS.txt") or die("Impossible d'ouvrir infos_concepts_TFBS.txt");
    	print(RES "biset_id \t|\t TF \t|\t tag_id \t|\t nb de gene ayant le TFBS \n");
     
    	  #prépare la requête sql
     		my $req2 = "SELECT t.".$table."virtualtag_id, TF.gene_product 
    				FROM ".$table."_TFBS t 
    				INNER JOIN ".$table."_virtual_observed_tag v 
    				ON t.".$table."virtualtag_id = v.".$table."virtualtag_id 
    				INNER JOIN biset_cont_tag b 
    				ON b.tagID = v.".$table."observedtag_id 
    				INNER JOIN ".$table."_transcription_factor TF 
    				ON TF.tf_id = t.tf_id 
    				WHERE bisetID = ?
    				AND b.tagID != ?
    				AND TF.gene_product = ? ;";
     
    		$res2 = $dbconnect_loc -> prepare($req2);
     
     
    	foreach my $biset_id (keys(%concept_infos))
    	{
     
        foreach my $tag (@{$concept_infos{$biset_id}})
    		{
    			$tagID = $tag->{"tagID"};
     			$TF = $tag->{"TF"};
    			#exécution de la requête sql
    			$res2 -> execute($biset_id, $tagID, $TF) || die("pb de selection : $DBI::errstr");
     
     
    			my $rows = $res2 -> rows; #compte le nb de lignes renvoyées par la requete
     
    			$concept_TF_TFBS{$biset_id} -> {$tagID}  = $rows;
    			print(RES "$biset_id \t\t|\t $TF \t\t|\t $tagID \t|\t $rows\n");
    			sleep(1);
    		}
    	}
    	close(RES);
     
    	#spécifie la fin de la requête
    	$res2 -> finish();
     
    	#deconnexion de la base
    	$dbconnect_loc ->disconnect();
     
    	return %concept_TF_TFBS;
    }
    Le but est de que DBI prépare ta requête une seule fois et au fur et à mesure des itérations, uniquement les condition du WHERE change. Ça évite de préparer et exécuter ta requête x fois inutilement.
    Voici la doc DBI sur ce sujet.

  11. #11
    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 : 38
    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
    Merci beaucoup !

    je vais directement faire un saut dans la doc pour en apprendre d'avantage.

  12. #12
    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
    Citation Envoyé par zaboug Voir le message
    est ce que mettre la table de hashage en variable globale reviendrait au même qu'utiliser une référence?
    Utiliser une référence du hash en argument de ta procédure est beaucoup plus propre et robuste car tu ne récupères que l'adresse mémoire (le pointeur) vers ton hash. et ça évite de faire des copies de ton hash et utiliser plus de mémoire que nécessaire. De plus, si tu souhaites passer plusieurs arguments, c'est possible alors qu'en donnant ton hash en entier, il te sera impossible de t'y retrouver par la suite.
    Consulte la FAQ sur les références, j'en parle.

  13. #13
    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 : 38
    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
    bon, au final, le premier script que j'avais fait (donc sans placeholder, et sans utiliser de référence) a mis un peu plus de 46 min à tourner, mais il a finit par donné un résultat.

    Du coup, j'ai ajouté les placeholder, et je suis en train de me battre avec les références. Une fois que j'aurais gagné , je relancerais le script pour voir la différence de rapidité

  14. #14
    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
    allez voici un coup de main Placeholder + références + Sleep enlevé

    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
    Recup_concepts_TFBS(\%concept_infos);
     
    sub Recup_concepts_TFBS 
    {
    	my ($concept_infos) = @_;
     
    	my ($res2, $tagID, $TF);	
    	my (%concept_TF_TFBS) = ();
     
    	&Connexion_BD();
     
    	open(RES, ">../resultats/infos_concepts_TFBS.txt") or die("Impossible d'ouvrir infos_concepts_TFBS.txt");
    	print(RES "biset_id \t|\t TF \t|\t tag_id \t|\t nb de gene ayant le TFBS \n");
     
    	  #prépare la requête sql
     		my $req2 = "SELECT t.".$table."virtualtag_id, TF.gene_product 
    				FROM ".$table."_TFBS t 
    				INNER JOIN ".$table."_virtual_observed_tag v 
    				ON t.".$table."virtualtag_id = v.".$table."virtualtag_id 
    				INNER JOIN biset_cont_tag b 
    				ON b.tagID = v.".$table."observedtag_id 
    				INNER JOIN ".$table."_transcription_factor TF 
    				ON TF.tf_id = t.tf_id 
    				WHERE bisetID = ?
    				AND b.tagID != ?
    				AND TF.gene_product = ? ;";
     
    		$res2 = $dbconnect_loc -> prepare($req2);
     
     
    	foreach my $biset_id (keys(%concept_infos))
    	{
     
        foreach my $tag (@{$concept_infos->{$biset_id}})
    		{
    			$tagID = $tag->{"tagID"};
     			$TF = $tag->{"TF"};
    			#exécution de la requête sql
    			$res2 -> execute($biset_id, $tagID, $TF) || die("pb de selection : $DBI::errstr");
     
     
    			my $rows = $res2 -> rows; #compte le nb de lignes renvoyées par la requete
     
    			$concept_TF_TFBS{$biset_id} -> {$tagID}  = $rows;
    			print(RES "$biset_id \t\t|\t $TF \t\t|\t $tagID \t|\t $rows\n");
    		}
    	}
    	close(RES);
     
    	#spécifie la fin de la requête
    	$res2 -> finish();
     
    	#deconnexion de la base
    	$dbconnect_loc ->disconnect();
     
    	return %concept_TF_TFBS;
    }

  15. #15
    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 : 38
    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
    merci beaucoup, j'arrivais pas à retrouver la syntaxe du deuxième foreach.

    Cela dit, tu as oublié une paire d'accolade au premier foreach, au final ça donne :

    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
     
    sub Recup_concepts_TFBS 
    {
    	my ($concept_infos) = @_;
     
    	my ($res2, $tagID, $TF);	
    	my (%concept_TF_TFBS) = ();
     
    	&Connexion_BD();
     
    	open(RES, ">../resultats/infos_concepts_TFBS.txt") or die("Impossible d'ouvrir infos_concepts_TFBS.txt");
    	print(RES "biset_id \t|\t TF \t|\t tag_id \t|\t nb de gene ayant le TFBS \n");
     
    	#prépare la requête sql
     	my $req2 = "SELECT t.".$table."virtualtag_id, TF.gene_product 
    				FROM ".$table."_TFBS t 
    				INNER JOIN ".$table."_virtual_observed_tag v 
    				ON t.".$table."virtualtag_id = v.".$table."virtualtag_id 
    				INNER JOIN biset_cont_tag b 
    				ON b.tagID = v.".$table."observedtag_id 
    				INNER JOIN ".$table."_transcription_factor TF 
    				ON TF.tf_id = t.tf_id 
    				WHERE bisetID = ?
    				AND b.tagID != ?
    				AND TF.gene_product = ? ;";
     
    	$res2 = $dbconnect_loc -> prepare($req2);
     
     
    	foreach my $biset_id (keys(%{$concept_infos}))
    	{
     
        	foreach my $tag (@{$concept_infos->{$biset_id}})
    		{
    			$tagID = $tag->{"tagID"};
     			$TF = $tag->{"TF"};
    			#exécution de la requête sql
    			$res2 -> execute($biset_id, $tagID, $TF) || die("pb de selection : $DBI::errstr");
     
     
    			my $rows = $res2 -> rows; #compte le nb de lignes renvoyées par la requete
     
    			$concept_TF_TFBS{$biset_id} -> {$tagID}  = $rows;
    			print(RES "$biset_id \t\t|\t $TF \t\t|\t $tagID \t|\t $rows\n");
    		}
    	}
    	close(RES);
     
    	#spécifie la fin de la requête
    	$res2 -> finish();
     
    	#deconnexion de la base
    	$dbconnect_loc ->disconnect();
     
    	return %concept_TF_TFBS;
    }
    Encore merci pour votre aide à tous les deux, vous avez corriger des erreurs d'optimisation que je fais souvent. Je vais pouvoir optimiser pas mal de mes scripts avec vos conseils.

    Je relance le script qui devrait être plus rapide maintenant.

  16. #16
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    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
    my %concept_infos = (
    	key1 => ['zero', 'un', 'deux', 'trois'],
    	key2 => ['zero_bis', 'un_bis', 'deux_bis', 'trois_bis'],
    );
     
     
    Recup_concepts_TFBS(\%concept_infos);
     
     
    sub Recup_concepts_TFBS 
    {
    	my ($ref_concept_infos) = @_;
     
     
    	foreach my $biset_id (keys(%concept_infos))
    	{
     
    		foreach my $tag (@{$ref_concept_infos->{$biset_id}})
    		{
     
    		}
    	}
     
    }
    Donc ainsi, pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $biset_id (keys(%concept_infos))
    on n'utilise plus la référence $ref_concept_infos mais la variable %concept_infos du script principal.

    Pourquoi ne pas utiliser la référence partout?
    -- Jasmine --

  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
    Tu nous diras s'il fait toujours 46 min

  18. #18
    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 : 38
    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
    je pense que c'était un oublie, j'ai poster le code en utilisant la référence partout dans le poste précédent juste le tien, les postes ont du se croiser

  19. #19
    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 : 38
    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
    Citation Envoyé par djibril Voir le message
    Tu nous diras s'il fait toujours 46 min
    c'est lancé, je manquerais pas de vous donner le temps qu'il prend à présent (de toute manière j'ai pas le choix d'attendre qu'il finisse de tourner : j'ai oublié de déplacer les fichiers généré par le script précédent avant de lancer le nouveau... )

  20. #20
    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
    j'espère que tu as viré le sleep !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Copier des données qui ne sont pas au même endroit
    Par nancy38 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 18/02/2013, 10h23
  2. [XL-2010] VBA - Macro se bloque toujours au même endroit
    Par cameleon1970 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 10/05/2012, 21h58
  3. Réponses: 8
    Dernier message: 25/11/2005, 18h38
  4. [XHTML] Balise <noscript> qui s'active toujour
    Par ARRG dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 20/03/2005, 23h52
  5. Requête SQL qui me bloque
    Par David Guillouet dans le forum Langage SQL
    Réponses: 5
    Dernier message: 27/04/2004, 14h52

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