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 :

récupérer un mot très très long


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 récupérer un mot très très long
    Bonjour,


    J'ai un fichier de deux lignes.
    >nom
    sequence
    J'aimerais récupérer la séquence afin de pouvoir la traiter mais elle fait 247249719 lettre et je n'arrive pas à la récupérer dans un scalaire. Mon idée était de récupérer cette séquence et de la couper en deux afin de créer deux demi séquences gérables par mon programme d'analyse. Ou alors le problème se pose au niveau du substr.
    Est-ce que quelqu'un a une idée sur la façon de procéder?
    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
    #!/usr/bin/perl -w
     
    use strict;
    use warnings;
    use FileHandle;
     
    #----------------------------------- CouperLongueSeq  -----------------------------------#
    #       Ce programme prend un fichier FASTA et crée 2 nouveaux fichiers FASTA
    #    contenant
    #    - la première moitié de la séquence + un chevauchement
    #    - la seconde moitié de la séquence - un chevauchement
    #----------------------------------- CouperLongueSeq  -----------------------------------#
     
     
     
    my $Path = "P:/Theorie/HUMAIN";
    my $Fich = "Seq_ref_chrtest1";
    my $NouvFichA = FileHandle->new(">".$Path."/".$Fich."a.fsa");
    my $NouvFichB = FileHandle->new(">".$Path."/".$Fich."b.fsa");
    print $Fich."\n";
    open(FICH, $Path."/".$Fich.".fsa") or print "IMPOSSIBLE D'OUVRIR LE FICHIER $Fich\n";
    my $Seq_Reference = LectureRapide($Path."/".$Fich.".fsa");
    my $Chevauchement = 500;
    my $Long_Seq = length($Seq_Reference);
     
    my $Sous_SeqA = substr($Seq_Reference, 0, $Long_Seq/2+$Chevauchement);
    my $Sous_SeqB = substr($Seq_Reference, $Long_Seq/2-$Chevauchement, $Long_Seq);
    print $NouvFichA ">".$Fich."A\n".$Sous_SeqA."\n";
    print $NouvFichB ">".$Fich."B\n".$Sous_SeqB."\n";
     
    close(FICH);
     
     
     
    sub LectureRapide
    {
            my $InFileRap = $_[0];
            my $LigneFas;
            my $SequenceTotale;
     
            open(FileRap,$InFileRap) or print "IMPOSSIBLE D'OUVRIR LE FICHIER $InFileRap\n";
            while ($LigneFas=<FileRap>)
            {
                    if($LigneFas =~ /^([A-Z]*)$/i)
                    {
                            $SequenceTotale = $1;
                            last; # on ne passera qu'une fois dans la boucle évite de récupérer les lignes vides de enter
                    }
            }
            close(FileRap);
            return($SequenceTotale);
    }
    J'ai un autre problème avec ce script, c'est que dans ma sous routine "LectureRapide" si je ne mets pas "last;" et que j'ai des enters en fin de fichier après ma séquence, ils sont récupérer dans $SequenceTotale qui prend dont une "valeur vide".
    J'ai une autre question dans /^([A-Z]*)$/ est-ce utile de mettre les ancres? Car j'ai l'impression qu'à cause de la proximité des parenthèses, cela est sans effet.

    Où peut on trouver les informations au sujet des limitations de Perl? Ou alors est aussi un problème au niveau de mon PC? Mon programme d'analyse a réussi à traiter une séquence de 191273063 lettres sans que je ne doive la scinder en deux.


    Merci de votre aide,


    Jasmine,

  2. #2
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    Avec une telle taille, peut-être vaut il mieux utiliser les références
    as tu essaye les références dans le code ou tu essayes d'utiliser la séquence complète ?

    en théorie, tu dupliques ton objet sequence_totale au moment du return, ce qui peut conduire à un dépassement mémoire. Utiliser les références permettrait d'éviter cette duplication.

    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
     
    my $Path = "P:/Theorie/HUMAIN";
    my $Fich = "Seq_ref_chrtest1";
    my $NouvFichA = FileHandle->new(">".$Path."/".$Fich."a.fsa");
    my $NouvFichB = FileHandle->new(">".$Path."/".$Fich."b.fsa");
    print $Fich."\n";
    open(FICH, $Path."/".$Fich.".fsa") or print "IMPOSSIBLE D'OUVRIR LE FICHIER $Fich\n";
    my $seq = "";
    LectureRapide($Path."/".$Fich.".fsa", \$seq);
    my $Chevauchement = 500;
    my $Long_Seq = length($seq);
     
    my $Sous_SeqA = substr($seq, 0, $Long_Seq/2+$Chevauchement);
    my $Sous_SeqB = substr($seq, $Long_Seq/2-$Chevauchement); # pas besoin de préciser la longueur si on veut jusqu'à la fin
    print $NouvFichA ">".$Fich."A\n".$Sous_SeqA."\n";
    print $NouvFichB ">".$Fich."B\n".$Sous_SeqB."\n";
     
    close(FICH);
     
     
     
    sub LectureRapide ($$)
    {
            my $InFileRap = shift;
            my $seq_ref = shift;
     
            open(FileRap,$InFileRap) or print "IMPOSSIBLE D'OUVRIR LE FICHIER $InFileRap\n";
            while (<FileRap>)
            {
                    chomp; # dégage les retours chariot
                    if(/^([A-Z]+)/i) # le * inclut 0, + démarre à 1, le ^ est nécessaire pour éviter de prendre le nom
                    {
                            $$seq_ref = $1;
                    }
            }
            close(FileRap);
    }
    Essaies de voir si tu peux utiliser les références pour récupérer ta séquence complète

  3. #3
    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
    Merci pour ta réponse, je suis en congé jusqu'à lundi mais dès que je suis de retour au boulot, je teste ton idée.

    Jasmine,

  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
    J'ai un message d'erreur
    main::LectureRapide() called too early to check prototype at P:\Perl\scripts2\Utiles\COUPER~1.PL line 23.
    Pourquoi mettre $$seq_ref dans la sous-routine? Est il ainsi directement attribué à $seq du programme principal?

    Merci,

    Jasmine,

  5. #5
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    $seq_ref est une référence à mon objet $seq

    pour indiquer que je modifie l'objet, et pas la référence, il me faut le 2e $ pour caster la référence en scalaire

    et le called too early indique juste que j'aurais du mettre le code de la sub LectureRapide plus haut, avant de faire appel a elle

  6. #6
    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
    A d'accord merci. Cela fonctionne bien sur ma petite séquence de test, je vais lancer la grande.

    Jasmine,

  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
    et bien non, cela ne fonctionne. Il doit bien y avoir un moyen de traiter un tel fichier. Je ne peux pas le manipuler avec Perl et encore moins l'ouvrir sous windows. Ce n'est pas grave, je vais virer ce fichier et en utiliser un autre qui contient les mêmes informations sur plusieurs lignes ainsi je surchargerai moins la mémoire.
    C'est quand même étrange, à l'origine je n'avais que ce second fichier contenant plusieurs lignes dont j'ai fait la concaténation afin de n'avoir plus qu'une seule séquence. Au niveau mémoire cela devrait pourtant la surcharger autant étant donné que la longueur de la séquence finale est la même. Or, ici avec la séquence écrite sur une seule ligne, mon programme n'arrive pas à la récupérer et plante. Pourriez-vous m'expliquer pourquoi? Merci.

    Merci,

    Jasmine,

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

Discussions similaires

  1. BDD sur réseau très très très lent...
    Par ericain dans le forum Access
    Réponses: 12
    Dernier message: 20/02/2015, 17h17
  2. newSchema(url) exécution très très très lente
    Par schum-hacker dans le forum Général Java
    Réponses: 6
    Dernier message: 21/01/2013, 09h32
  3. Logiciel intranet très très très lent
    Par openeyes dans le forum ALM
    Réponses: 7
    Dernier message: 15/02/2011, 15h16
  4. Améliorer les performances - très (très) (très) grands datasets
    Par debdev dans le forum Administration et Installation
    Réponses: 6
    Dernier message: 08/01/2010, 16h46
  5. Démarrage trés, trés, trés difficile
    Par Cazaux-Moutou-Philippe dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 29/06/2008, 10h45

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