Perl Language
Optimierung der Speichernutzung
Suche…
Dateien lesen: foreach vs. while
Beim Lesen einer möglicherweise großen Datei hat eine while
Schleife einen erheblichen Speichervorteil gegenüber foreach
. Das Folgende liest die Datei nach Datensatz (standardmäßig bedeutet "Datensatz" "eine Zeile", wie in $/
), wobei jeder von ihnen beim Lesen $_
zugewiesen wird:
while(<$fh>) {
print;
}
Der Diamantoperator mag hier etwas Magie, um sicherzustellen, dass die Schleife nur am Ende der Datei endet und nicht z. B. in Zeilen, die nur ein "0" -Zeichen enthalten.
Die folgende Schleife scheint genauso zu funktionieren, wertet jedoch den Diamantenoperator im Listenkontext aus, wodurch die gesamte Datei auf einmal gelesen wird:
foreach(<$fh>) {
print;
}
Wenn Sie sowieso immer nur einen Datensatz verwenden, kann dies zu einer großen Speicherverschwendung führen und sollte daher vermieden werden.
Lange Listen bearbeiten
Wenn Sie bereits eine Liste im Speicher haben, ist die einfache und meist ausreichend zu verarbeitende Methode eine einfache foreach
Schleife:
foreach my $item (@items) {
...
}
Dies ist z. B. für den üblichen Fall gut, wenn einige Verarbeitungen für $item
und dann in eine Datei geschrieben werden, ohne dass die Daten erhalten bleiben. Wenn Sie jedoch aus den Elementen eine andere Datenstruktur aufbauen, ist eine while
Schleife speichereffizienter:
my @result;
while(@items) {
my $item = shift @items;
push @result, process_item($item);
}
Wenn ein Verweis auf $item
direkt in der Ergebnisliste @items
wird, können Elemente, die Sie aus dem @items
Array verschoben haben, @items
werden, und der Speicher kann vom Interpreter bei der nächsten @items
der Schleife erneut verwendet werden.