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.005 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.