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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    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 éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    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.

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

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    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 éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    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);

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

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    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 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    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 éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    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}})
    		{
     
     
    		}
    	}
    }

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

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, 11h23
  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, 22h58
  3. Réponses: 8
    Dernier message: 25/11/2005, 19h38
  4. [XHTML] Balise <noscript> qui s'active toujour
    Par ARRG dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 21/03/2005, 00h52
  5. Requête SQL qui me bloque
    Par David Guillouet dans le forum Langage SQL
    Réponses: 5
    Dernier message: 27/04/2004, 15h52

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