es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error de Sobrecarga de Memoria al ejecutar una secuencia larga y ambigua debido a (sre.yield_AllStrings)

Esperaba que alguien pudiera ayudarme.

Estoy tratando de crear una función que, dada una secuencia de ADN (in)ambigua y un intervalo de peso molecular, devuelva una lista de todas las secuencias no ambiguas representadas por la secuencia dada.

Hasta ahora he llegado a esto:

import re
import sre_yield
from Bio import SeqIO
import Bio.SeqUtils
from Bio.Seq import Seq
import Bio.SeqIO

def all_seq_between_upper_lower_mw(file, lower_mw, upper_mw):
    file = SeqIO.read(file,'fasta')
    sequence = file.seq
    seqs_opt = Bio.SeqUtils.nt_search("", sequence)
    seqs = list(sre_yield.AllStrings(seqs_opt[0]))
    if (len(seqs) == 1):
        print("Esta secuencia es no ambigua")
        mol_weight = Bio.SeqUtils.molecular_weight(results[0])
        if mol_weight > lower_mw and mol_weight < upper_mw:
            print("Secuencia de nucleótidos: "+str(seqs[0])+"  y  peso molecular = "+str(mol_weight))
        else:
            print("Esta secuencia no se encuentra dentro de los límites de peso molecular proporcionados")
    else:
        print("Esta secuencia es ambigua")
        results = dict()
        for record in seqs:
            results[record] = Bio.SeqUtils.molecular_weight(record)
        possibility_counter = 0
        for seq, mol_weight in results.items():
            possibility_counter += 1
            if mol_weight > lower_mw and mol_weight < upper_mw:
                print("Posibilidad "+str(possibility_counter)+": "+str(seq)+"  y  peso molecular = "+str(mol_weight))
            else:
                print("Posibilidad "+str(possibility_counter)+": Esta secuencia no se encuentra dentro de los límites de peso molecular proporcionados")

Este código se ejecuta perfectamente con una secuencia corta (in)ambigua. Pero cuando se le proporciona una secuencia ambigua que es bastante larga, aparece el error: Sobrecarga de memoria, que apunta a la función sre.yield_AllStrings.

Para referencia, archivo FASTA de secuencia ambigua corta:

>seq_7009 secuencia aleatoria
DGRGGGWAVCVAACGTTGAT

Archivo FASTA de secuencia ambigua larga:

>seq_445 secuencia aleatoria
ARYGNTAVHGAMRRACNTNHSGVYGVRCGAGAHTGVBCKWACACAGTKYCACGBGAGGYGTCCGYTGVGASCC

Sigo siendo nuevo en Python, pero espero que alguien pueda saber cómo solucionar el error de memoria.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución al Error de Sobrecarga de Memoria

    La función sre_yield.AllStrings() genera todas las posibles coincidencias no superpuestas de una expresión regular en una cadena. En este caso, está generando todas las posibles secuencias inequívocas a partir de una secuencia de ADN ambigua. El error ocurre cuando la secuencia de entrada es demasiado larga, lo que resulta en un gran número de posibles secuencias inequívocas.

    Una forma de resolver el error de sobrecarga de memoria es generar las secuencias inequívocas de forma iterativa en lugar de almacenarlas todas en memoria de una vez. Aquí hay una versión modificada del código que puede manejar secuencias ambiguas largas sin errores de sobrecarga de memoria:

    import re
    from Bio import SeqIO, Seq
    from Bio.SeqUtils import nt_search, molecular_weight
    
    def all_seq_between_upper_lower_mw(file, lower_mw, upper_mw):
        record = SeqIO.read(file, 'fasta')
        seq = record.seq
        ambiguity_code = {"R": "AG", "Y": "CT", "M": "AC", "K": "GT", "W": "AT", \
                          "S": "GC", "B": "CGT", "D": "AGT", "H": "ACT", "V": "ACG", "N": "ACGT"}
    
        unambiguous_seqs = set()
    
        # Buscar regiones ambiguas y reemplazarlas con todas las combinaciones inequívocas posibles
        ambiguous_regions = re.finditer('[RYSWKMBDHVN]', str(seq))
        regions_replaced = 0
        for region in ambiguous_regions:
            start, end = region.start(), region.end()
            for unambiguous_base in ambiguity_code[seq[start]]:
                new_seq = str(seq[:start]) + unambiguous_base + str(seq[start+1:end])
                for unambiguous_seq in find_unambiguous_seqs(new_seq):
                    unambiguous_seqs.add(str(seq[:start]) + str(unambiguous_seq) + str(seq[end:]))
            regions_replaced += 1
    
        # Si no se encuentran regiones ambiguas, se utiliza la secuencia original
        if regions_replaced == 0:
            unambiguous_seqs.add(str(seq))
    
        # Calcular pesos moleculares para cada secuencia inequívoca
        for i, u_seq in enumerate(unambiguous_seqs):
            mol_weight = molecular_weight(Seq.Seq(u_seq))
            if mol_weight > lower_mw and mol_weight < upper_mw:
                print("Secuencia {}: {}  & peso molecular = {}".format(i+1, u_seq, mol_weight))
            else:
                print("Secuencia {}: Esta secuencia no está dentro de los límites de peso molecular dados".format(i+1))
    
    # Función auxiliar para encontrar todas las posibles secuencias inequívocas a partir de una secuencia ambigua
    def find_unambiguous_seqs(seq):
        if 'X' not in seq:
            yield seq
        else:
            for base in 'ACGT':
                new_seq = seq.replace('X', base, 1)
                for unambiguous_seq in find_unambiguous_seqs(new_seq):
                    yield unambiguous_seq
    
    # Ejemplo de uso
    all_seq_between_upper_lower_mw('seq_long.fasta', 5000, 6000)
    

    En el código modificado, se identifican las regiones ambiguas y se reemplazan mediante la iteración de todas las combinaciones inequívocas posibles. La función find_unambiguous_seqs() genera todas las posibles secuencias inequívocas a partir de una sola secuencia ambigua de forma iterativa utilizando la recursión.

    Este enfoque reduce significativamente el uso de memoria y permite que la función maneje secuencias ambiguas largas sin errores de sobrecarga de memoria.

Comments are closed.