Perl Language
Оптимизация использования памяти
Поиск…
Чтение файлов: foreach и while
При чтении потенциально большой файл, будет в while
цикл имеет значительное преимущество над памятью foreach
. Следующее будет читать запись файла по записи (по умолчанию «запись» означает «строка», как указано в $/
), присваивая каждому значение $_
мере чтения:
while(<$fh>) {
print;
}
Алмазный оператор делает здесь немного волшебства, чтобы убедиться, что цикл завершается только в конце файла, а не на линиях, содержащих только символ «0».
Следующий цикл, похоже, работает одинаково, однако он оценивает оператора алмаза в контексте списка, заставляя весь файл читать за один раз:
foreach(<$fh>) {
print;
}
Если вы работаете в одной записи одновременно, это может привести к огромной трате памяти, и поэтому ее следует избегать.
Обработка длинных списков
Если у вас уже есть список в памяти, простой и обычно достаточный способ его обработки - простой цикл foreach
:
foreach my $item (@items) {
...
}
Это нормально, например, для обычного случая выполнения некоторой обработки на $item
а затем записывать его в файл без сохранения данных. Тем не менее, если вы строите некоторые другую структуру данных из элементов, в while
цикл меньше памяти:
my @result;
while(@items) {
my $item = shift @items;
push @result, process_item($item);
}
Если ссылка на $item
напрямую не попадает в ваш список результатов, элементы, которые вы @items
массивом @items
могут быть освобождены, а память будет повторно использована интерпретатором при вводе следующей итерации цикла.