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

Bioinformatique Perl Discussion :

Traitement fichier 2 go


Sujet :

Bioinformatique Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 21
    Par défaut Traitement fichier 2 go
    Bonjour,

    je dois traiter de très gros fichiers de séquences, ~ 2go. Fichiers issus de séquençage.
    Je veux compter le nombre de A,T,C,G,N pour chaque cycle, c'est à dire à chaque position, (exemple 36) et cela pour chaque tile (100 tiles en tout). Je prend en compte le fait qu'il puisse y avoir jusqu'à 8 fichiers.


    voilà un extrait de mon 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
     
     
    my %nbycycle;
     
    while(<ENTREE>){
     
    		my @ligne = split /\t/, $_;
     
    		my @sequence = split //, $ligne[8];
    		my $i=1;
     
    		foreach my $seq (@sequence){
     
    			$nbycycle{$ligne[2]}{$ligne[3]}{$i}{$seq}++; #{fichier}{tile}{cycle}{base}
    			$i++;
    		}
     
    	}
    Le résultat est ok mais je voudrais que ce soit plus rapide (~25 min pour l'instant pour un fichier). Donc y aurai t'il un moyen d'améliorer l'algo ou tester avec un autre langage ou autre chose.

    Merci.

  2. #2
    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
    montre nous quelques lignes de ton fichier.

  3. #3
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 21
    Par défaut
    HWI-EAS387 90810 5 1 10 89 0 1 GGGGCCAGGGAGTGAGATCAGGAAGGGGACAGGCAA `````aa_`aa^X`a`\a_XXU_^a`aUGXYJ]aaa chr16.fa 85230887 F 36 117 Y
    HWI-EAS387 90810 5 1 10 1835 0 1 TGGGAGGCCCAGGACACATGCCAGAGGAGGGATTAG a__Ra]OO[I_P\GGN_aR^^`^`\\_``^WW\P\[ chr3.fa 128241989 F 3T9C22 81 N
    HWI-EAS387 90810 5 1 10 198 0 1 CACTTTCCCCTGTCTTTCAGCTCTGTCCGTGTGCAG a`aXZ`a]baa]`[aba`aaaa^NYXaYFVDNO^^V chr22.fa 16170918 F 36 114
    Y

    Voilà un exemple, ce qui m'intéresse c'est la 4ème colonne et la 9ème biensur.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 156
    Par défaut
    Bonjour,
    Globalement, tu gagnera peu ou rien en écrivant dans un autre langage, Perl est compilé puis exécuté en tant que code machine, donc tu pers un peu de temps au lancement du script, pas à l'exécution. Dans ton cas, si c'est pour gagner 1ms...

    Sur un fichier de 1,8Giga avec ton code ça me prend 2mn.
    Sortir les "my" de la boucle ne change rien (on est toujours à 2mn +/- 2s).

    En utilisant des tableaux plutôt que des hash on retombe aussi sur la même vitesse de traitement.

    Les idées simples ne donnent rien, c'est ptêt une question à poser au niveau algorithme...

  5. #5
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 21
    Par défaut
    Citation Envoyé par 50Nio Voir le message
    Bonjour,
    Globalement, tu gagnera peu ou rien en écrivant dans un autre langage, Perl est compilé puis exécuté en tant que code machine, donc tu pers un peu de temps au lancement du script, pas à l'exécution. Dans ton cas, si c'est pour gagner 1ms...

    Sur un fichier de 1,8Giga avec ton code ça me prend 2mn.
    Sortir les "my" de la boucle ne change rien (on est toujours à 2mn +/- 2s).

    En utilisant des tableaux plutôt que des hash on retombe aussi sur la même vitesse de traitement.

    Les idées simples ne donnent rien, c'est ptêt une question à poser au niveau algorithme...
    2 min ??
    Moi il met 20min (au lieu de 25 comme j'ai dit au début, j'ai fait du vide dans le script).
    Mais j'ai testé seulement la partie que je vous ai montré et elle me prend ~20min.
    Il faut dire que je teste ça sur mon pc de bureau qui a 4 Mo de ram.
    En routine il tournera sur un serveur de calcul beaucoup plus costaud.

    Merci de vos réponses.

  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
    Citation Envoyé par JP2mars Voir le message
    4 Mo de ram.
    , ça existe encore ? Tu m'étonnes qu'il mette 20 minutes

  7. #7
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 21
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    HWI-EAS387	90810	5	100	9	883	0	1	AAGCGGTCCATCCTCACTCAGGCTCTAACTTCTTTC	BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB	NM											N
    HWI-EAS387	90810	5	100	10	428	0	1	AGCCCTCCATCAATATGGGGGAACTACACTTTAGAT	^Xa\Tab_H]O[J^K`QGT^NHM[^\\LY_BBBBBB	NM											N
    HWI-EAS387	90810	5	100	10	420	0	1	GGGGAGGCAAGTATCTCTGTATGGAGAGCTGGTCTC	^QZMYHTZ`X\JHO^^^[I]WOHZQYIQ_JYOX``b	NM											N

    Voilà un exemple, ce qui m'intéresse c'est la 4ème colonne et la 9ème biensur.

    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Tile	Cycle	A	C	G	T	N
    1	1	35879	26146	25766	35577	370
    1	2	37203	23508	26328	35994	705
    ...
    1	36	35592	25316	23325	37755	1750
    2	1	34777	24895	26191	35063	345
    ...
    2	36	35930	24834	24191	34910	1406
    ...
    100  36     .....

    Merci


    PS: les symbols à la suite de la séquence c'est du code. Chaque signe correspond au score qualité.
    Je devrais traiter ça en plus après.

  8. #8
    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
    Bon je ne comprends pas ton résultat. Je pensais que tu souhaitais juste compter le nombre d'acides nucléique pour chaque ligne de ton fichier (chaque séquence)!! Or là, si je prends :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Tile	Cycle	A	C	G	T	N
    1	1	35879	26146	25766	35577	370
    Qu'est ce que ça veut dire ?

  9. #9
    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
    Ton code est résumé à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    my ( %N, %A, %C, %G, %T );
    while ( my $ligne = <ENTREE> ) {
     
      chomp($ligne);
      my ( undef, undef, undef, $TOTO, undef, undef, undef, undef, $sequence ) = split( /\t/, $ligne );
      my $A{$TOTO} = () = $sequence =~ m{A}g;
      my $C{$TOTO} = () = $sequence =~ m{C}g;
      my $G{$TOTO} = () = $sequence =~ m{G}g;
      my $T{$TOTO} = () = $sequence =~ m{T}g;
      my $N{$TOTO} = () = $sequence =~ m{N}g;
    }
    close(ENTREE);
    print "fichier $file ok\n";
    Est ce que ça te convient, ai je compris ton souci ?

  10. #10
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 21
    Par défaut
    Citation Envoyé par djibril Voir le message
    Bon je ne comprends pas ton résultat. Je pensais que tu souhaitais juste compter le nombre d'acides nucléique pour chaque ligne de ton fichier (chaque séquence)!! Or là, si je prends :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Tile	Cycle	A	C	G	T	N
    1	1	35879	26146	25766	35577	370
    Qu'est ce que ça veut dire ?

    Une piste sur un séquenceur est divisé en 100 cases appelé Tile.
    Pour chacune de ces Tiles je dois pour chaque cycle compter le nombre de ACTGN.
    La position 1 de la séquence correspond au premier cycle.

    En tout j'ai 100*36 ligne pour lesquels j'ai mon nombre de ACTGN.

Discussions similaires

  1. [POI] Traitement fichier EXCEL
    Par the java lover dans le forum Documents
    Réponses: 3
    Dernier message: 23/06/2008, 11h45
  2. traitement fichier binaire
    Par noussa_nouha dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 21/10/2006, 14h45
  3. Traitement fichier excel avec vb6
    Par couscoussier dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 12/09/2006, 16h15
  4. [PERL] traitement fichier texte
    Par osiris73 dans le forum Langage
    Réponses: 10
    Dernier message: 05/05/2006, 20h06
  5. Optimiser traitement fichier [.txt]
    Par Metallic-84s dans le forum Langage
    Réponses: 14
    Dernier message: 16/03/2006, 13h33

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