Perl Language
Optimización del uso de la memoria.
Buscar..
Lectura de archivos: foreach vs. while
Cuando se lee un archivo potencialmente grande, un while
de bucle tiene una ventaja significativa sobre la memoria foreach
. Lo siguiente leerá el registro del archivo por registro (de manera predeterminada, "registro" significa "una línea", según lo especificado en $/
), asignando cada uno a $_
medida que se lee:
while(<$fh>) {
print;
}
El operador Diamond hace algo de magia aquí para asegurarse de que el bucle solo finalice al final del archivo y no, por ejemplo, en líneas que contengan solo un carácter "0".
El siguiente bucle parece funcionar igual, sin embargo, evalúa el operador Diamond en el contexto de la lista, lo que hace que todo el archivo se lea de una sola vez:
foreach(<$fh>) {
print;
}
De todos modos, si está operando en un registro a la vez, esto puede resultar en una gran pérdida de memoria y, por lo tanto, debe evitarse.
Procesando listas largas
Si ya tiene una lista en la memoria, la forma sencilla y generalmente suficiente de procesarla es mediante un simple bucle foreach
:
foreach my $item (@items) {
...
}
Esto está bien, por ejemplo, para el caso común de realizar un procesamiento en $item
y luego escribirlo en un archivo sin mantener la información. Sin embargo, si usted acumula alguna otra estructura de datos de los artículos, un while
de bucle es más eficiente de la memoria:
my @result;
while(@items) {
my $item = shift @items;
push @result, process_item($item);
}
A menos que una referencia a $item
termine directamente en su lista de resultados, los elementos que eliminó de la matriz @items
se pueden liberar y el intérprete puede reutilizar la memoria cuando ingresa a la siguiente iteración de bucle.