10
votes

Pour analyser un fichier FASTA à l'aide d'un générateur (Python)

J'essaie d'analyser un grand fichier FASTA et je rencontre des erreurs de mémoire. Certaines suggestions pour améliorer la gestion des données seraient appréciées. Actuellement, le programme imprime correctement les noms, cependant partiellement via le fichier que je reçois un MemoratRror

est le générateur xxx

et voici que le talon de l'appelant sera ajouté après Cette pièce fonctionne xxx

pour ceux qui ne sont pas fimilaires avec le format FASTA ici est un exemple xxx

Chaque entrée commence par un ">" Indique le nom, etc. alors les lignes N suivantes sont des données. Il n'y a pas d'extrémité définie des données autres que la ligne suivante ayant un ">" au début.


3 commentaires

Quelle est la taille du fichier? Quelle est la taille de la séquence maximale?


La taille du fichier variera considérablement de quelques centaines de mégots à GB. La taille de la séquence maximale ne doit pas être plus que 1000-2000 bases (caractères, nombre indéterminé de lignes)


Où obtenez-vous le MemoryError? S'il vous plaît poster la traçabilité complète.


4 Réponses :


15
votes

Avez-vous envisagé d'utiliser BiopyThon . Ils ont un lecteur de séquence qui peut lire des fichiers FASTA. Et si vous souhaitez coder un vous-même, vous pouvez regarder Code de BiopyTon .

edit : code ajouté xxx


7 commentaires

Merci pour le lien avec le code réel de l'analyseur de fichiers. Je serai en mesure de modifier cela pour travailler juste bien. Avez-vous une idée pourquoi le code actuel ne fonctionne pas? J'aimerais savoir d'un "quoi de ne pas faire la prochaine fois" POV.


Il est difficile de dire pourquoi votre code échoue, mais je le réécrireais les lignes proposées par HughdBrown. Accumuler chaque morceau dans une liste et seulement à la fin, rejoignez la liste dans une chaîne et renvoyez une tuple avec nom et séquence. De plus, je ne sais pas quelle version Python utilisez-vous mais Python3 utilise beaucoup plus de mémoire pour une chaîne python 2.x. Ils résolvent cela dans Python 3.3 python.org/dev/peps/pep-0393 < / a>. J'ai édité ma réponse avec une solution possible.


Je ne peux vraiment pas obtenir ce concept. Pourquoi "si name:"? Je peux le faire sans générateur, mais le générateur se passe sur ma tête. Quelqu'un veuillez expliquer comment le "si name" et le travail de rendement. Si le nom? Le nom n'en est pas. Comment cela marche-t-il?!


Quand le nom est-il attribué des données? Il cède après avoir demandé si le Bool (nom) == True. Je ne comprends pas quand il obtient des données


L'ajout du «rendement» rend la fonction dans un itérateur - vous pouvez appeler .NEXT () dessus et le rendement suivant dans la séquence d'exécution retournera certaines valeurs (nom et SEQ) à la portée des parents. Les deux si le nom: Les affirmations traitent les conditions initiales et finales de l'opération d'analyse, avec un Aucun comme une valeur faux booléenne. La condition initiale est qu'aucune donnée SEQ n'a été lue - A > est rencontrée. Une fois que le prochain > est rencontré, la première séquence aura été lue. De même, à la fin du fichier, la dernière séquence chargée doit être transmise.


Comment fonctionne "pour la ligne dans la FP"? Vous n'êtes pas obligé d'ouvrir un fichier et d'utiliser des readlines () avant itération?


@jukhamil Le fichier est ouvert dans le avec . De plus, un fichier est son propre itérateur. Jetez un coup d'œil à: docs.python.org/2/library/stdtypes .html # fichier.next



0
votes

Sans avoir une excellente compréhension de ce que vous faites, j'aurais écrit le code comme celui-ci: XXX

Ceci regroupe les données après une ligne de départ jusqu'à la prochaine ligne de départ. Rendre SEQ Un tableau signifie que vous minimisez la jonction de la chaîne jusqu'au dernier moment possible. Céder un tuple a plus de sens qu'une liste.


0 commentaires

7
votes

Un analyseur pymparsing pour ce format n'est que quelques lignes longues. Voir les annotations dans le code suivant:

['>', '1', 'PB2', 'AATATATTCAATATGGAGAGAATAAAAGAACTAAGAGATCTAATGTCACAGTCTCGCACTCGCGAGATACTCACCAAAACCACTGTGGACCACATGGCCATAATCAAAAAGTACACATCAGGAAGGCAAGAGAAGAACCCTGCACTCAGGATGAAGTGGATGATG']
- index: 1
- key: PB2
- sequence: AATATATTCAATATGGAGAGAATAAAAGAACTAAGAGATCTAATGTCACAGTCTCGCACTCGCGAGATACTCACCAAAACCACTGTGGACCACATGGCCATAATCAAAAAGTACACATCAGGAAGGCAAGAGAAGAACCCTGCACTCAGGATGAAGTGGATGATG
['>', '2', 'PB1', 'AACCATTTGAATGGATGTCAATCCGACTTTACTTTTCTTGAAAGTTCCAGCGCAAAATGCCATAAGCACCACATTTCCCTATACTGGAGACCCTCC']
- index: 2
- key: PB1
- sequence: AACCATTTGAATGGATGTCAATCCGACTTTACTTTTCTTGAAAGTTCCAGCGCAAAATGCCATAAGCACCACATTTCCCTATACTGGAGACCCTCC


0 commentaires

0
votes
def read_fasta(filename):
    name = None
    with open(filename) as file:
        for line in file:
            if line[0] == ">":
                if name:
                    yield (name, seq)
                name = line[1:-1].split("|")[0]
                seq = ""
            else:
                seq += line[:-1]
        yield (name, seq)

0 commentaires