|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Nouveau Membre du Club
![]() Inscription : janvier 2010 Messages : 200 ![]() |
Bonjour à tous,
Je suis confrontée à un problème que je n'arrive pas à résoudre. J'ai un fichier qui ressemble à cela : Code :
>seq8 TCCACAACGATGGAAGATGATGA >seq14 AAAGAAGAAATTGAATAAATATA Quelqu'un aurait une idée ? |
||
|
|
00
|
|
|
#2 |
|
Membre chevronné
![]() |
hum petit pseudo algo:
__________________
Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro. Plus les choses changent, plus elles restent les mêmes |
|
|
00
|
|
|
#3 | ||
|
Nouveau Membre du Club
![]() Inscription : janvier 2010 Messages : 200 ![]() |
Alors j'ai fait quelque choses comme ceci mais qui ne fonctionne pas :
Code :
|
||
|
|
00
|
|
|
#4 | ||||
|
Nouveau Membre du Club
![]() Inscription : janvier 2010 Messages : 200 ![]() |
j'ai fait comme ceci :
Code :
J'ai modifié comme ceci, ca à l'air de fonctionner à présent : Code :
|
||||
|
|
00
|
|
|
#5 | ||
|
Membre chevronné
![]() |
je voyais plus simple
Code :
__________________
Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro. Plus les choses changent, plus elles restent les mêmes |
||
|
|
00
|
|
|
#6 |
|
Nouveau Membre du Club
![]() Inscription : janvier 2010 Messages : 200 ![]() |
ah oui effectivement, ce sera surement moins long que ce que j'ai fait !
Merci beaucoup ! |
|
|
00
|
|
|
#7 |
|
Nouveau Membre du Club
![]() Inscription : janvier 2010 Messages : 200 ![]() |
Bonjour,
Je réécris dans ce post car je réutilise ce script, mais cela fait maintenant 4 jours qu'il tourne sur 2196958 séquences, sur un serveur ( disques : 6To brut, mémoire vive : 16Go). J'aurai voulu savoir si cela était normal, ou si j'attendais pour rien ? Comment puis je "optimiser" ce script pour que le résultat me soit retourné plus rapidement ? je ne connais que Perl comme langage de programmation ... Faudrait il que je passe dans un autre langage de prog ? Merci d'avance ! |
|
|
00
|
|
|
#8 | ||
|
Membre du Club
![]() BioInformaticien Inscription : décembre 2012 Messages : 49 ![]() |
Bonjour,
En théorie si ton script fonctionne sur un plus petit jeu de données, il n'y a aucune raison que tu te retrouves dans une boucle infinie. Une lecture rapide me fait croire que tu fais d'assez gros tableaux... Je ne serais donc pas surpris que cela prenne du temps (et cela quelque soit ton langage). Quand je sais qu'un script fa être long, je n'hésite pas a imprimer dans la console ou dans un fichier séparé des indicateurs de mon avancement : Par exemple, si tu es dans une boucle, tu peux mettre un compteur et faire un print tout les 10 000 ou 100 000 occurences : Code perl :
|
||
|
|
00
|
|
|
#9 |
|
Nouveau Membre du Club
![]() Inscription : janvier 2010 Messages : 200 ![]() |
oui justement , j'ai mit des print, juste après le hash ( il s'affiche au bout de quelques secondes), et ensuite, avant l'affichage (qui ne s'est toujours pas affiché) depuis 4 jours !
N'y a t'il pas une autre solution que d'utiliser des tableaux ? |
|
|
00
|
|
|
#10 |
|
Membre du Club
![]() BioInformaticien Inscription : décembre 2012 Messages : 49 ![]() |
Il y a des chances que tu passes/aies passé beaucoup de temps dans le sort... Trier 2 millions de valeurs c'est assez long. Et cette fonction est en C donc impossible d'améliorer/optimiser cette étape.
Le grep aussi peut être long si tu as beaucoup de séquences uniques. Tu as regardé ce qui est limitant de la mémoire ou du CPU ? Tu as vérifié que ton job était bien en train de tourner ? C'est peut être ton serveur qui sature sous le nombre de jobs aussi. |
|
|
00
|
|
|
#11 |
|
Nouveau Membre du Club
![]() Inscription : janvier 2010 Messages : 200 ![]() |
Non je ne sais pas du tout comment on fait cela ...
|
|
|
00
|
|
|
#12 |
|
Nouveau Membre du Club
![]() Inscription : janvier 2010 Messages : 200 ![]() |
Est ce que je ne pourrai pas faire un sort avec une commande bash, creer un fichier trier et ensuite lire ce fichier et faire la suite du programme ? je ne sais pas si le sort unix est plus rapide ...
|
|
|
00
|
|
|
#13 |
|
Membre du Club
![]() BioInformaticien Inscription : décembre 2012 Messages : 49 ![]() |
Si tu es sur linux le plus simple c'est l'interface htop (je vais me faire tirer les oreilles par les pros la
) :Dans ta console, lances la commande htop. Tu vas obtenir une interface graphique qui te permettra de suivre ton CPU et ta mémoire. htop a l'avantage d'être assez simples a utiliser. Tu peux te servir des flèches de ton clavier pour te diriger dans la liste des logiciels lancés. Plus d'info la (sourceforge). Il y a pleins d'explications sur le net à htop que tu devrais trouver assez facilement |
|
|
00
|
|
|
#14 | ||
|
Nouveau Membre du Club
![]() Inscription : janvier 2010 Messages : 200 ![]() |
Alors j'ai fait 'htop' :
pour le script que j'ai lancé, PRI : 20 VIRT 917M RES : 884M SHR : 1932 S : R CPU : 99% MEM : 11% Je n'y comprends pas grand chose ! Sous tes conseils, j'ai rajouté un print après le sort, le sort se fait très rapidement, je pense que ce qui est long c'est le parcours de tous les tableaux ... Code :
|
||
|
|
00
|
|
|
#15 |
|
Membre du Club
![]() BioInformaticien Inscription : décembre 2012 Messages : 49 ![]() |
A l'oeil tu satures complètement ta vitesse de calcul, ce qui est plutôt bien (je préfère saturer le CPU à la mémoire... )
tu devrais aussi mettre un print après ton sort de la ligne 34; Ensuite il faut voir ce que fait ton script : Supposons que le premier million de séquences soient uniques, de la séquence 1 000 001 à 2 000 000 tu vas devoir faire 1 000 000 de greps (séquences uniques) sur 1 000 000 de séquences... Sachant que grep est une fonction (très bien optimisée cela va de soit) qui demande un peu de temps de calcul... |
|
|
00
|
|
|
#16 |
|
Nouveau Membre du Club
![]() Inscription : janvier 2010 Messages : 200 ![]() |
Oui, le "print sort" après la ligne 34 est vraiment très rapide (quelques secondes).
Donc je ne sais pas quoi penser ... comment optimiser car 4 jours sans aucun résultat c'est vraiment long je trouve |
|
|
00
|
|
|
#17 |
|
Membre du Club
![]() BioInformaticien Inscription : décembre 2012 Messages : 49 ![]() |
Alors plus qu'une seule possibilité... Trop de greps! (si toutes tes séquences sont uniques tu arrives a plusieurs milliers de milliards de greps! si tu supposes que chacun prend 1/100eme de secondes, je te laisse faire le calcul du temps...)
tu peux eventuellement diviser ton fichier en 100, faire ton script sur tous, puis réunir ton fichier résultat et refaire ton script... Comme ça ton nombre de calcul cahngera de dimension |
|
|
00
|
|
|
#18 |
|
Nouveau Membre du Club
![]() Inscription : janvier 2010 Messages : 200 ![]() |
oui j'avais penser à diviser mon fichier original en plusieurs fichier et faire un script bash pour appliquer ce script à tous ces fichiers temporaires ... Tu penses que cela diminuerai radicalement le temps de calcul ?
|
|
|
00
|
|
|
#19 | ||
|
Membre chevronné
![]() |
on peut aussi ajouter quelques améliorations:
par exemple tu classes par ordre alphabétique tes séquences:, ce qui je l'avoue me semble inutile un classement par taille réduirait les calculs puisqu'on est certain que les séquences suivantes sont forcément plus grandes que celles déjà traitées. du coup pas besoin de remplacer les séquences. Code :
__________________
Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro. Plus les choses changent, plus elles restent les mêmes |
||
|
|
00
|
|
|
#20 | ||
|
Nouveau Membre du Club
![]() Inscription : janvier 2010 Messages : 200 ![]() |
ok comme ceci :
Code :
|
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com