Perl Language
Optimisation de l'utilisation de la mémoire
Recherche…
Lecture de fichiers: foreach vs. while
Lors de la lecture d' un fichier potentiellement important, un while
boucle a un avantage de mémoire importante sur foreach
. Ce qui suit lira l’enregistrement de fichier par enregistrement (par défaut, "record" signifie "une ligne", comme spécifié par $/
), en attribuant chacun à $_
tel qu’il est lu:
while(<$fh>) {
print;
}
L' opérateur de diamant fait de la magie ici pour s'assurer que la boucle ne se termine qu'à la fin du fichier et non par exemple sur les lignes contenant uniquement un caractère "0".
La boucle suivante semble fonctionner de la même manière, mais elle évalue l'opérateur de diamant dans un contexte de liste, ce qui entraîne la lecture complète du fichier:
foreach(<$fh>) {
print;
}
Si vous utilisez de toute façon un enregistrement à la fois, cela peut entraîner un énorme gaspillage de mémoire et doit donc être évité.
Traitement de longues listes
Si vous avez déjà une liste en mémoire, le moyen le plus simple et le plus simple de le traiter est une simple boucle foreach
:
foreach my $item (@items) {
...
}
Cela convient bien, par exemple, au traitement courant de $item
et à son écriture dans un fichier sans conserver les données. Toutefois, si vous construisez une autre structure de données à partir des éléments, une while
boucle est plus efficace mémoire:
my @result;
while(@items) {
my $item = shift @items;
push @result, process_item($item);
}
À moins qu'une référence à $item
se retrouve directement dans votre liste de résultats, les éléments que vous avez décalés du tableau @items
peuvent être libérés et la mémoire réutilisée par l'interpréteur lorsque vous entrez dans la prochaine itération de la boucle.