Página 1 de 1

SNP coincidentes entre dos archivos

NotaPublicado: 2013-02-11 07:12 @341
por kty_wk
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.

Re: SNP coincidentes entre dos archivos

NotaPublicado: 2013-02-11 13:21 @597
por explorer
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.