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 могут быть освобождены, а память будет повторно использована интерпретатором при вводе следующей итерации цикла.