Mi script que suma variables me tarda mucho
Publicado: 2014-06-16 18:13 @801
Hola de nuevo, sigo aprendiendo a hacer scripts en Perl.
Hasta ahora tenía uno que me servía muy bien, pero ahora que tengo archivos más grandes me tarda muchísimo en correr (pronóstico: semanas), y querría saber si me pueden ayudar a optimizarlo.
Lo que tengo que hacer es lo siguiente: Tengo dos archivos con columnas. Los dos archivos son replicas de un experimento, y lo que necesito es sumar los datos que son iguales y grabarlos en otro archivo. Para reconocer que son iguales lo que hago es dividir las columnas de los archivos, y poner un condicional en donde si determinados ID cumplen las características, que me lo sumen.
Mi programa es el siguiente:
Como ven, el condicional tiene que cumplir que los ID y los cromosomas sean los mismos, y además que las coordenadas sean las mismas, entre otras cosas.
Si es así, que imprima la suma y otras variables en un archivo de salida.
El tema es que los archivos tienen como 1 millón de líneas y al correrlo veo que cada suma tarda entre dos o tres segundos.
Entiendo que es un programa muy rudimentario y poco eficiente, ya que tiene que abrir y leer los archivos cada vez. ¿Tal vez un hash me ayude a optimizarlo?
¿Alguna ayuda de cómo podría hacerlo?
Me han dicho que con comandos de bash seguro que me anda más rápido (estilo awk y grep), pero quería probar y de paso aprender a tratar de hacerlo en Perl.
Gracias de antemano por cualquier ayuda que puedan darme.
Saludos.
Hasta ahora tenía uno que me servía muy bien, pero ahora que tengo archivos más grandes me tarda muchísimo en correr (pronóstico: semanas), y querría saber si me pueden ayudar a optimizarlo.
Lo que tengo que hacer es lo siguiente: Tengo dos archivos con columnas. Los dos archivos son replicas de un experimento, y lo que necesito es sumar los datos que son iguales y grabarlos en otro archivo. Para reconocer que son iguales lo que hago es dividir las columnas de los archivos, y poner un condicional en donde si determinados ID cumplen las características, que me lo sumen.
Mi programa es el siguiente:
Using perl Syntax Highlighting
- #!/usr/local/bin/perl
- use strict;
- use warnings;
- my $input1 = "/home/dzavallo/Downloads/sRNAs/M82_MZA/A/join/AA_join_repeats20";
- my $input2 = "/home/dzavallo/Downloads/sRNAs/M82_MZA/B/join/AB_join_repeats20";
- my $output = "/home/dzavallo/Downloads/sRNAs/M82_MZA/sumados/AB_repeats20_sumados";
- open( FILE1, "<$input1.txt" ) or die "could not open $input1 file";
- open( OUTPUTFILE, ">>$output.txt" ) or die "could not $output.txt output file";
- while (<FILE1>) { ## 16 LTR LTR:PGSC0003DMS000000392:567:723:1905:+ 13116 2947 26 SL2.50ch11 18600276 18600301
- my @split1 = split( /\s/, $_ );
- my $id1 = $split1[0];
- my $id2 = $split1[1];
- my $id3 = $split1[2];
- my $countsRPM1 = $split1[4];
- my $length1 = $split1[5];
- my $chr1 = $split1[6];
- my $coord1 = $split1[7];
- my $coord2 = $split1[8];
- open( FILE2, "<$input2.txt" ) or die "could not open $input2 file";
- while (<FILE2>) { ## 16 LTR LTR:scaffold06318:1532:6859:6930:+ 14108 2940 26 SL2.50ch06 42984094 42984119
- my @split2 = split( /\s/, $_ );
- my $id4 = $split2[0];
- my $id5 = $split2[1];
- my $id6 = $split2[2];
- my $countsRPM2 = $split2[4];
- my $length2 = $split2[5];
- my $chr2 = $split2[6];
- my $coord3 = $split2[7];
- my $coord4 = $split2[8];
- my $result = $countsRPM1 + $countsRPM2;
- if ( ( $id3 eq $id6 )
- and ( $coord1 == $coord3 and $coord2 == $coord4 )
- and ( $chr1 eq $chr2 )
- and ( $length1 == $length2 ) ) {
- print OUTPUTFILE "$id1\t$id2\t$id3\t$result\t$length1\t$chr1\t$coord1\t$coord2\n";
- print "$countsRPM1\t$countsRPM2\t$result\n";
- print
- "$id1\t$id4\t$id2\t$id5\t$id3\t$id6\t$result\t$length1\t$length2\t$chr1\t$chr2\t$coord1\t$coord3\t$coord2\t$coord4\n";
- }
- }
- }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Como ven, el condicional tiene que cumplir que los ID y los cromosomas sean los mismos, y además que las coordenadas sean las mismas, entre otras cosas.
Si es así, que imprima la suma y otras variables en un archivo de salida.
El tema es que los archivos tienen como 1 millón de líneas y al correrlo veo que cada suma tarda entre dos o tres segundos.
Entiendo que es un programa muy rudimentario y poco eficiente, ya que tiene que abrir y leer los archivos cada vez. ¿Tal vez un hash me ayude a optimizarlo?
¿Alguna ayuda de cómo podría hacerlo?
Me han dicho que con comandos de bash seguro que me anda más rápido (estilo awk y grep), pero quería probar y de paso aprender a tratar de hacerlo en Perl.
Gracias de antemano por cualquier ayuda que puedan darme.
Saludos.