Perl Language
Ottimizzazione dell'uso della memoria
Ricerca…
Lettura dei file: foreach vs. while
Durante la lettura di un file potenzialmente grande, un ciclo while
ha un vantaggio significativo sulla memoria rispetto a foreach
. Quanto segue leggerà il record del file per record (per impostazione predefinita, "record" significa "una riga", come specificato da $/
), assegnando ciascuno a $_
come viene letto:
while(<$fh>) {
print;
}
L' operatore diamante fa un po 'di magia qui per assicurarsi che il ciclo si fermi solo alla fine del file e non per esempio sulle linee che contengono solo un carattere "0".
Il seguente ciclo sembra funzionare lo stesso, tuttavia valuta l'operatore di diamante nel contesto dell'elenco, provocando la lettura dell'intero file in una volta sola:
foreach(<$fh>) {
print;
}
Se si opera comunque su un disco alla volta, ciò può comportare un enorme spreco di memoria e dovrebbe quindi essere evitato.
Elaborazione di lunghi elenchi
Se si dispone già di un elenco in memoria, il modo semplice e generalmente sufficiente per elaborarlo è un semplice ciclo foreach
:
foreach my $item (@items) {
...
}
Questo va bene, ad esempio per il caso comune di fare qualche elaborazione su $item
e poi scriverlo su un file senza mantenere i dati in giro. Tuttavia, se crei un'altra struttura dati dagli elementi, un ciclo while
è più efficiente in termini di memoria:
my @result;
while(@items) {
my $item = shift @items;
push @result, process_item($item);
}
A meno che un riferimento a $item
finisca direttamente nell'elenco dei risultati, gli oggetti che hai spostato dall'array @items
possono essere liberati e la memoria riutilizzata dall'interprete quando inserisci l'iterazione del ciclo successivo.