Какой инструмент я должен использовать для определения моего распределения памяти в Perl? - PullRequest
6 голосов
/ 09 июня 2010

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

Размер файла, который я извлек, составляет 800 МБ, и мой процесс Perl, который анализирует, что данные выделяются примерно на 1,6 ГБ во время выполнения.Я понимаю, что могу ошибаться в причинах этой проблемы, но не уверен, что это самый эффективный способ доказать / опровергнуть мою теорию.

Обновление:

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

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

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

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

Тогда я не получаю инфляцию в моей памяти.Это имеет смысл и является наиболее логичным при получении данных в моей ситуации.

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

Ответы [ 2 ]

4 голосов
/ 09 июня 2010

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

Насколько вы можете предположить, самый простой способ опровергнуть это написать простую программу на Perl, которая:

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

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

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

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

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

4 голосов
/ 09 июня 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...