Coucou
Voilà j'ai un programme qui traite un gros fichier de séquences d'ADN au format FASTA, il permet de trier les séquences dans 3 tableaux associatifs différents (%tab5, %tab3 et %tabref) en fonction du type de séquence .
Ces tableaux associatifs contiennent la ligne de commentaire (commencant par un >) en clé et la séquence correspondante en valeur.
Le soucis est que le fichier de séquence n'est pas véritablement au format FASTA il possede des lignes vides et des lignes commentées (commencant par un #), ce qui explique la présence du :
if ($_ =~ /^[^\s+\#]/
Ce programme fonctionne correctement sur chacun des quatres quarts du fichier et ceci rapidement (de ll'ordre de 2 minutes) mais quand j'essaye sur le fichier entier je n'en ai jamais vu la fin en sachant que j'ai attendu pratiquement 2heures d'execution...
Ce fichier contient 507 629 sequences...
Je met le code ci dessous:
my (%tab5, %tab3, %tabref);
my ($defline, $seq, $defline5, $defline3, $deflineref);
my $numtot=0;
my $num5=0;
my $num3=0;
my $numref=0;
#=========================================================================================================================================
# Lecture du fichier à traiter (UNIGENE)
#=========================================================================================================================================
my $seq_file = $ARGV[0];
my $seq_res = $ARGV[1];
chomp ($seq_file);
# ouvrir le fichier en lecture
open (SEQ,"$seq_file") || die "cannot open '$seq_file' : $!";
open (RES,">$seq_res") || die "cannot open '$seq_res' : $!";
#=========================================================================================================================================
# Repartition des sequences
#=========================================================================================================================================
# lire le fichier
while (<SEQ>) {
chomp;
# prendre la defline: elle devient la clef de chacun des tableaux associatifs %tab5, %tab3 et %tabref
if ($_ =~ /^[^\s+\#]/){ #evite les lignes vides et les lignes commencant par un #
if ($_ =~ /^>.*/x) { #si la ligne commence par un >
$numtot++;
$defline = $_;
if ($defline =~ "clone_end=5'") { #selection des sequences 5'
# put_tab(\%tab5, $defline);
$num5++;
$defline5 = $defline;
$tab5{$defline5} ="";
}
elsif ($defline =~ "clone_end=3'") { #selection des sequences 3'
$num3++;
$defline3 = $defline;
$tab3{$defline3}="";
}
else {
$numref++;
$deflineref = $defline; #selection des sequences ref
$tabref{$deflineref}="";
}
}
# attibuer la séquence pour sa defline correspondante
elsif ($defline =~ "clone_end=5'") {
$tab5{$defline} .= $_;
}
elsif ($defline =~ "clone_end=3'") {
$tab3{$defline} .= $_;
}
elsif ($defline) {
$tabref{$defline} .=$_;
}
}
print1 "$numtot\n";
}
print2 "$numtot\n";
close (SEQ);
Si je fais le print1 je vois bien l'evolution du traitement...mais le print2 je ne le vois pas en attendant pratiquement 2heures ... j'estime que c'est pas normal et donc je peux pas savoir si ca bug a un endroit ou si le pgme tourne tjs...
Merci d'avance pour votre aide,
![:wahoo: :wahoo:]()
Perlgirl