Так как WWW :: Mechanize по умолчанию имеет свой пользовательский агент, сохраняющий всю историю при просмотре
Устанавливает глубину стека страниц, которая отслеживает все загруженные страницы. По умолчанию размер стека фактически бесконечен. Если стек поглощает вашу память, то установите меньшее число, скажем 5 или 10. Установка этого значения на ноль означает, что мех не будет хранить историю.
Таким образом, объект продолжает расти. Используя Devel::Size qw(total_size)
, я отслеживаю размер $mech
, чтобы увидеть, что он добавляет десятки килобайт после каждого PDF-файла. И сценарий явно находит много совпадений; Я завершил свой тест, когда он сожрал 10% памяти (и на диске было много десятков файлов размером более Гб). . В принципе, это расточительно, но на самом деле это не увеличивает накладных расходов, хотя и ограничивает максимальный размер.
Или сбросить его, или действительно ограничить глубину его стека. Поскольку код, похоже, не нуждается в go возвращении к предыдущим состояниям, на самом деле нет необходимости в каком-либо стеке, поэтому ваше решение сбросить его вполне подойдет.
Комментарии
Точнее "утечки" в скрипте нет; просто требуется все больше и больше памяти
Всегда иметь use strict;
и use warnings;
в верхней части скрипта
Лучше не использовать синтаксис косвенного объекта для создания экземпляра объекта (new Package
), а использовать обычный вызов метода (Package->new
), чтобы в некоторых случаях избежать неоднозначности. См. Объяснение в документах и этой странице , а также примеры проблем в этом сообщении и этом сообщении .