Какой инструмент я должен использовать для обнаружения моего выделения памяти в Perl?

Я хлебал в большом файле с помощью File::Slurp, но дал размер файла I, видят, что у меня должен быть он в памяти дважды, или возможно это становится расширенным, будучи превращенным в 16 битов unicode. Как я могу лучше всего диагностировать такую проблему в Perl?

Файл, который я втянул, составляет 800 МБ в размере и моем процессе жемчуга, это анализирует те данные, выделили примерно 1.6 ГБ во времени выполнения.

Я понимаю, что могу быть неправ относительно своей причины проблемы, но я не уверен самый эффективный способ доказать/опровергнуть мою теорию.

Обновление:

У меня есть elminated изворотливая кодировка символов из списка подозреваемых. Похоже, что я копирую переменную в какой-то момент, я просто не могу выяснить где.

Обновление 2:

Я теперь сделал еще некоторое расследование и обнаружил, что это на самом деле просто получает данные из File::Slurp, это вызывает проблему. Я взглянул через документацию и обнаружил, что могу заставить ее возвращать scalar_ref, т.е.

my $data = read_file($file, binmode => ':raw', scalar_ref => 1);

Затем я не получаю инфляцию своей памяти. Который имеет некоторый смысл и является самой логической вещью сделать при получении данных в моей ситуации.

Информация о взгляде на то, какие переменные существуют и т.д., имеет обычно полезный хотя спасибо.

6
задан Colin Newell 12 June 2010 в 14:03
поделиться

2 ответа

Может быть, Devel :: DumpSizes и / или Devel :: Size могут помочь? Я думаю, что первое было бы более полезно в вашем случае.

Devel :: DumpSizes - Вывести имя и размер в байтах (в порядке возрастания) переменных, которые доступны в заданной точке сценария.

Devel :: Size - Расширение Perl для определения использования памяти переменными Perl

4
ответ дан 16 December 2019 в 21:34
поделиться

Вот некоторые общие ресурсы по проблемам памяти в Perl:

Что касается вашего собственного предположения, то самым простым способом опровержения будет написание простой Perl-программы, которая:

  1. Создает большой (100M) файл обычного текста, возможно, просто выводя одну и ту же строку в цикле в файл, или для бинарных файлов выполняя команду dd через system() вызов

  2. Читает файл, используя стандартный Perl open()/@a=<>;

  3. Измеряет потребление памяти.

Затем повторите #2-#3 для вашего 800M файла.

Это покажет вам, в чем проблема: в File::Slurp, в странной логике вашей программы или в специфическом содержимом файла (например, неаскрипт, хотя я буду удивлен, если это окажется причиной)

.
4
ответ дан 16 December 2019 в 21:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: