• Publicidad

SNP coincidentes entre dos archivos

Perl aplicado a la bioinformática

SNP coincidentes entre dos archivos

Notapor kty_wk » 2013-02-11 07:12 @341

Hola, necesito ayuda para agilizar una miniprograma.

El programa trata de abrir dos archivos, uno de más de 800 000 líneas y otro de longitud variable (de 10 líneas a 20 000 líneas) que contiene información por columnas. El primero y más largo contiene por columnas (separadas por varios espacios y no tabuladores): Cromosoma, SNP, posición, etc.; el segundo, SNP y Gen, separados por tabulador.

Mi intención es obtener un archivo de salida con solo los SNP coincidentes en los dos archivos. El código que he escrito es:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/user/bin/perl
use strict;
use warnings;

my @lin1=();
my @lin2=();

open (FITXER, "Archivo_largo.txt");
while (<FITXER>)
        {
        chomp;
        @lin1=split(/\s+/,$_);
               
        open (ARCHIVO, "Archivo_corto.txt");
        while (<ARCHIVO>)
                {
                chomp:
                @lin2=split(/\t/,$_);
               
                open SORTIDA, '>>Archivo_salida.txt';
                        if ($lin2[0] eq $lin1[2])
                                {
                                print SORTIDA  "@lin2\n";
                                }
                close SORTIDA;
                }
        close (ARCHIVO);
        }
close (FITXER);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El programa funciona para ficheros pequeños, pero es extremadamente lento con los archivos pesados que yo tengo.

Sé que cargar toda la información en los arrays es innecesario y hace el programa mucho más lento. Recuerdo de mis clases de Perl que se puede guardar sólo la información que te interesa en una cadena con expresiones regulares, pero soy incapaz de recordar (ni encontrar) cómo hacerlo.

Muchas gracias de antemano.
kty_wk
Perlero nuevo
Perlero nuevo
 
Mensajes: 1
Registrado: 2013-02-11 06:56 @330

Publicidad

Re: SNP coincidentes entre dos archivos

Notapor explorer » 2013-02-11 13:21 @597

Bienvenido a los foros de Perl en Español, kty_wk.

Cuidado, porque tienes un triple bucle anidado... eso no debe estar bien. Seguro que debes mover el open() más interno fuera de los otros dos.

Este es un tema recurrente en este subforo de Bioinformática.

La mejor solución es leer un archivo y guardar los códigos que nos interesan en un hash, y luego recorrer por líneas el otro archivo (generalmente el más grande o el que no cabe en memoria), y sacar los códigos coincidentes.

Por ejemplo: Contar los códigos a partir de un archivo en otro.

Inténtalo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados