Tengo dos archivos de texto que contengan la siguiente:
FILE1.txt
dog
cat
antelope
FILE2.txt
1
2
Barry
La salida de los que quiero lograr es la siguiente:
dog1
dog2
dogBarry
cat1
cat2
catBarry
antelope1
antelope2
antelopeBarry
De la manera en que me han pasado sobre ella:
open (FILE1, "<File1.txt") || die $!;
open (FILE2, "<File2.txt") || die $!;
my @animals = (<FILE1>); #each line of the file into an array
my @otherStrings = (<FILE2>); #each line of the file into an array
close FILE1 || die $!;
close FILE2 || die $!;
my @bothTogether;
foreach my $animal (@animals) {
chomp $animal;
foreach my $otherString (@otherStrings) {
chomp $otherString;
push (@bothTogether, "$animal$otherString");
}
}
print @bothTogether;
La forma en que me han hecho obras, pero estoy seguro de que no es la mejor manera de ir sobre él especialmente cuando los archivos podrían contener miles de líneas?
Cuál sería la mejor manera de hacerlo que ser, tal vez de usar un hash?
- Si los archivos son demasiado grandes para la memoria, sólo se puede leer mientras se está procesando (y no antes, como lo hace ahora). Hashes no va a ayudar, porque había cargar todo en memoria de todos modos; y el procesamiento de «foreach» de todos modos.
- Sólo una nota, también puede:
my @animals = chomp(<FILE1>);
- También creo que el script va a estar bien memorywise, porque sólo el archivo resultante será grande, y escribe línea por línea.
Su enfoque funciona bien para los archivos con miles de líneas. Que realmente no es grande. Para millones de líneas, podría ser un problema.
Sin embargo, podría reducir el uso de memoria de su código sólo por la lectura de un archivo en la memoria, así como la impresión de los resultados inmediatamente en lugar de almacenarlos en un array:
Con dos enormes archivos de igual tamaño, este será el uso más o menos 1/4 de la memoria de su código original.
Actualización: también he editado el código para incluir Simbabque buenas sugerencias para su modernización.
Actualización 2: Como otros han señalado, se podía leer ni archivo en la memoria, pasando a través de las cargas de archivo línea por línea en cada línea de los animales de archivo. Sin embargo, de que sería mucho más lento. Se debe evitar a menos que sea absolutamente necesario. El enfoque que he sugerido será de aproximadamente la misma velocidad que su código original.
Además de ciertos Moderno Perl aspectos (de dos argumentos
open
por ejemplo) el código es bastante sencillo.La única mejora que veo es que usted puede mover el interior
chomp
en un ciclo extra, tal vez hacer la muerde mientras usted lee el archivo. Que iba a ahorrar un poco de tiempo. Pero a pesar de todo, si quieres hacer algo con los datos de cada fila de algunos otros datos, lo estás haciendo bien.Debe utilizar
or die
en lugar de|| die
porque de precedencia, y el resultado final será una larga línea porque no hay más puedes incluir varias líneas en el de la matriz de elementos.Actualización: @FrankB hizo una buena sugerencia su comentario de arriba: Si los archivos son muy grandes, y usted está luchando con la memoria que no debe sorber ellos y los puso en las dos matrices, pero en lugar de leer y el proceso de la primera línea por línea, y abrir y leer el segundo para cada uno de estos primero de líneas. Que tarda un poco más, pero se ahorra una tonelada de memoria. A continuación, salida directamente los resultados, así en vez de empujar en los resultados de la matriz.