Re: Mejorar script para que sea más rápido
Publicado: 2015-08-06 20:18 @888
6 horas sigue siendo demasiado... para Perl
Modificando la estructura una vez más, añadiendo ordenación numérica a los finales, creamos un engendro como este:
que es un array de arrays de arrays de arrays.
En la primera dimensión están los valores de Chr. En la segunda, los inicios asociados a ellos. En la tercera, los finales asociadas cada inicio, y en la cuarta, un array que almacena cada valor de final con el valor del gen.
Pero... con el añadido de que los finales están ordenados numéricamente, al revés, por lo que será fácil terminar el bucle si sabemos que $posicion no va a estar en el resto de finales.
Entonces el programa queda así:
Modificando la estructura una vez más, añadiendo ordenación numérica a los finales, creamos un engendro como este:
Using text Syntax Highlighting
(
undef,
[
[30, [[600, "AT1G010X2"]]],
[
50,
[
[600, "AT1G010X3"],
[500, "AT1G01021"],
[350, "AT1G01020"],
[300, "AT1G010X0"],
[290, "AT1G010X1"],
],
],
[200, [[360, "AT1G010X4"]]],
],
[
[50, [[400, "AT1G010X7"]]],
[100, [[200, "AT1G010X6"]]],
[200, [[300, "AT1G010X5"]]],
],
[[200, [[400, "AT1G010X8"], [100, "AT1G010X9"]]]],
)
undef,
[
[30, [[600, "AT1G010X2"]]],
[
50,
[
[600, "AT1G010X3"],
[500, "AT1G01021"],
[350, "AT1G01020"],
[300, "AT1G010X0"],
[290, "AT1G010X1"],
],
],
[200, [[360, "AT1G010X4"]]],
],
[
[50, [[400, "AT1G010X7"]]],
[100, [[200, "AT1G010X6"]]],
[200, [[300, "AT1G010X5"]]],
],
[[200, [[400, "AT1G010X8"], [100, "AT1G010X9"]]]],
)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
En la primera dimensión están los valores de Chr. En la segunda, los inicios asociados a ellos. En la tercera, los finales asociadas cada inicio, y en la cuarta, un array que almacena cada valor de final con el valor del gen.
Pero... con el añadido de que los finales están ordenados numéricamente, al revés, por lo que será fácil terminar el bucle si sabemos que $posicion no va a estar en el resto de finales.
Entonces el programa queda así:
Using perl Syntax Highlighting
- #!/usr/bin/perl
- use feature 'say';
- use autodie;
- #my $dir = '/home/damian/Escritorio/Arrays/';
- my $dir = '.';
- my $input1 = "$dir/archivo1.txt";
- my $input2 = "$dir/archivo2.txt";
- my $output = "$dir/salida.txt";
- # Procesar el segundo archivo para crear la estructura
- my @matrix;
- open my $INPUT2, '<', $input2;
- while (<$INPUT2>) {
- ## AT1G01020 1 50 350
- my($gen,$chr,$inicio,$final) = split;
- $matrix[$chr]{$inicio}{$final} = $gen;
- }
- close $INPUT2;
- #use Data::Dump;
- #dd(@matrix);
- # Ordenación de los valores de inicio, y de final
- for my $chr ( 1 .. $#matrix ) {
- my $HoH = $matrix[$chr];
- my @inicios = # ordenación de los inicios
- sort { $a->[0] <=> $b->[0] }
- map { [ $_, $HoH->{$_} ] }
- keys %{ $HoH }
- ;
- for my $inicios_ref (@inicios) { # para cada inicio
- my $h = $inicios_ref->[1];
- my @finales = # ordenamos sus finales, al revés
- sort { $b->[0] <=> $a->[0] }
- map { [ $_, $h->{$_} ] }
- keys %{ $h }
- ;
- $inicios_ref->[1] = \@finales; # pasamos de hash de hash a array de array
- }
- $matrix[$chr] = \@inicios; # para cada $chr
- }
- #dd( @matrix );
- # Procesar el primer archivo, por líneas
- open my $INPUT1, '<', $input1;
- open my $SALIDA, '>', $output;
- while (<$INPUT1>) {
- chomp;
- my($chr, $posicion, $cuentas) = split;
- for my $inicio_ref ( @{ $matrix[$chr] } ) { # recorremos todos los valores de inicio
- my($inicio,$finales_ref) = @{ $inicio_ref };
- last if $inicio > $posicion; # salimos si $posicion ya no está dentro
- for my $final_ref ( @{ $finales_ref } ) { # recorremos los finales asociados a ese $inicio
- last if $posicion > $final_ref->[0]; # salimos si $posicion ya no está dentro
- # gen Chr cuentas posición
- say $SALIDA join "\t", $final_ref->[1], $chr, $cuentas, $posicion
- }
- }
- }
- close $INPUT1;
- close $SALIDA;
- __END__
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4