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:
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);
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.003 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.