Tengo un problema de optimización con un pequeño script. Lo que tengo que hacer es: teniendo dos archivos, comprobar que la primera parte (hasta el primer espacio) de cada línea de uno de los archivos se encuentre en el otro archivo, y de no ser así, pegar toda esa línea en un nuevo archivo resultado.
Mi script es el siguiente;
Using perl Syntax Highlighting
- #!/usr/bin/perl
- use strict;
- use warnings;
- open (FILE ,"archivo1");
- open (FILE2 ,"archivo2");
- my %hash;
- foreach my $line (<FILE>)
- {
- my @linea = split( /\t/, $line );
- my $lectura = $linea[0];
- my $veces++;
- $hash{$lectura} = $veces;
- }
- foreach my $line2 (<FILE2>)
- {
- my @linea2 = split( /\t/, $line2 );
- my $lectura2 = $linea2[0];
- unless (defined $hash{$lectura2})
- {
- open OUTPUT,">>resultado";
- print OUTPUT "$line2";
- close OUTPUT;
- }
- }
- close (FILE);
- close (FILE2);
- END;
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
El script hace lo que pretendo, pero el gran problema es que mis archivos son terriblemente grandes (aproximadamente unos 4GB cada uno, aunque los he particionado).
¿Alguna idea de cómo podría hacer que mi programa fuera más rápido?
Hasta el momento, de todas las soluciones que he probado la de trabajar con el hash es la que mejor resultado me ha dado (grep era mucho más lento).
Un saludo.