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 :

Perl - processus arreté


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut Perl - processus arreté
    Bonjour à tous.
    Quand je lance le script ci dessous sur un fichier test (4,0K), tout se passe bien. En revanche, lorsque je le lance sur mon fichier de 102M, il m'est indiqué après quelques minutes "processus arrêté", est ce que cela vient de mon script ?

    Je cherche en fait à supprimer le premier nucleotide puis le second puis le troisième etc jusqu'a ce que ma sequence ait une longueur > à l'entier $int , par exemple, ici $int = 20 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    >seq
    CATCTGGTATCTGTTGGGTACATCC 
    >seq_nb1
    ATCTGGTATCTGTTGGGTACATCC 
    >seq_nb2
    TCTGGTATCTGTTGGGTACATCC 
    >seq_nb3
    CTGGTATCTGTTGGGTACATCC 
    >seq_nb4
    TGGTATCTGTTGGGTACATCC 
    >seq_nb5
    GGTATCTGTTGGGTACATCC
    j'ai donc écrit ce script:
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    use Carp qw(confess);
    use Getopt::Long;
    use Bio::SeqIO;
     
    my ($fasta_file,$out_file);
    my ($int,$cut,$len);
    my (%hash,%dico);
     
    GetOptions("fasta=s" => \$fasta_file,"seed=i" => \$int ,"out=s" => \$out_file); 
     
     
    #open (OUT, ">"."$input"."_"."$number".".fasta") or die "Cannot open outfile!";
     
     
    my $in = Bio::SeqIO->new( -file => $fasta_file, '-format' => 'Fasta' );
    open(my $out,'>',$out_file) or die "$out_file : $!\n\n";
     
    while ( my $seq = $in->next_seq()){
    	my $id = $seq->primary_id ;
    	my $sequence = $seq->seq ;
    	$len = $seq->length();
    	my $count = 0;
    	while($len >= $int){
    		$cut = substr($sequence,$count);
    		push(@{$dico{$id}->{'sequence'}}, $cut);
    		$len--;
    		$count++;
     
     
    	}
     
    }
     
    foreach my $data (keys(%dico)){
    	my $i=0;
    	foreach my $seq (@{$dico{$data}->{'sequence'}}){
    		print {$out} "$data"."_nb$i"."\n$seq\n";
    		$i++;
    	}
    }
    Je souhaiterai savoir s'il y a unproblème dans mon script ?
    Merci d'avance,
    Bonne journée à tous

  2. #2
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    J'avoue ne pas comprendre ton besoin réel (et je ne te demande pas, pour l'instant, de le rendre plus clair).
    Cependant, j'ai l'impression que l'on peut remplacer ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	my $count = 0;
    	while($len >= $int){
    		$cut = substr($sequence,$count);
    		push(@{$dico{$id}->{'sequence'}}, $cut);
    		$len--;
    		$count++;
    	}
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      push @{$dico{$id}->{sequence}}, split //, $sequence;
    Bien entendu, ça ne répond pas à ta question (et ça ne la résoudra sans doute pas).
    Je ne vois pas d'autre idée que l'erreur puisse venir de Bio::SeqIO (sur une séquence particulière peut-être).
    Ton fichier fasta n'est pas vérolé ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Merci pour ta réponse,
    Non, mon fichier fasta est ok !
    Ca ne peut pas venir d'un problème de mémoire ou autre du fait que mon fichier contienne des millions de sequences ?

  4. #4
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Si bien sur, c'est tout à fait possible.
    Je suis en train d'essayer d'installer Bio::IOSeq pour tester avec un énorme fichier de 235Mo (que j'ai généré avec l'uniligne suivant). Mais j'ai beaucoup de problème pour installer ce module, donc je n'aurai pas de résultat probant avant lundi.

    Pour ceux qui voudraient t'aider, voici le script uniligne permettant de générer un fichier fasta aléatoire très gros.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ perl -E 'foreach my $seq (0 .. 500000) { say ">seq_nb$seq"; say join "", map { [qw(A T C G)]->[rand(3)] } 0 .. rand(1000); }' > seq2.fasta
    (attention aux quotes si vous utilisez Windows).

    On peut faire varier la taille en jouant sur 500000 (nombre de séquences) et 1000 (taille max d'une séquence).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    La taille maximale de mes séquences est de 29 nt

  6. #6
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Points : 1 491
    Points
    1 491
    Par défaut
    Bonjour,

    Il est probable que cela provienne de la façon dont tu parses ton fichier. En effet, le module Bio :: Seq met l'ensemble des séquences en mémoire. Vu la taille de ton fichier, il est bien possible que tu dépasses les capacités mémoire.
    Cela demande du courage d'en tirer du plaisir
    Quand on n'a qu'un marteau, tous les problèmes ressemblent à un clou

  7. #7
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    D'accord donc le mieux serait de parcourir avec quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    while (<$in>){
     
    	if ($_=~/>/){
    		$title=$_;
    		$title=~s/>//;
    	}
    	else{
    		$seq{$_}=$title;
    	}
    }
    et ensuite, faire le travail sur ce hash ?

  8. #8
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Merci beaucoup Stoyak ! Effectivement cela devait probablement venir du module Bio :: Seq, car en faisant comme ci dessous,en meme pas 1 minutes j'ai mon fichier de sortie !!

    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
    while (<$fasta>){
    	chomp;
    	if ($_=~/>/){
    		$title=$_;
    		$title=~s/>//;
    	}
    	else{
    		$len=length($_);
    		my $count = 0;
    		while($len >= $int){
    			$cut = substr($_,$count);
    			push(@{$dico{$title}->{'sequence'}}, $cut);
    			$len--;
    			$count++;
     
     
    		}
     
    	}
    }
     
    print "Done 1 !\n";
     
    foreach my $data (keys(%dico)){
    	my $i=0;
    	foreach my $seq (@{$dico{$data}->{'sequence'}}){
    		print {$out} ">$data"."_nb$i"."\n$seq\n";
    		$i++;
    	}
    }

  9. #9
    Rédactrice

    Avatar de stoyak
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 408
    Points : 1 491
    Points
    1 491
    Par défaut
    C'est parfait !

    Un petit tag résolu peut-être ?!
    Cela demande du courage d'en tirer du plaisir
    Quand on n'a qu'un marteau, tous les problèmes ressemblent à un clou

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

Discussions similaires

  1. [PERL] processus fils
    Par Ashin dans le forum Langage
    Réponses: 2
    Dernier message: 21/04/2010, 18h08
  2. Perl : Processus
    Par Luciefer dans le forum Langage
    Réponses: 2
    Dernier message: 23/07/2007, 09h24
  3. quand perl s'arrete de manière inexpliquée
    Par stoyak dans le forum Web
    Réponses: 24
    Dernier message: 13/06/2006, 11h09
  4. Processus impossible à arrêter
    Par tiboooo dans le forum Windows XP
    Réponses: 13
    Dernier message: 02/05/2006, 06h54
  5. Tuer un processus lance par system sous perl
    Par gedeon555 dans le forum Langage
    Réponses: 4
    Dernier message: 10/04/2006, 17h11

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