Я хлебал в большом файле с помощью 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);
Затем я не получаю инфляцию своей памяти. Который имеет некоторый смысл и является самой логической вещью сделать при получении данных в моей ситуации.
Информация о взгляде на то, какие переменные существуют и т.д., имеет обычно полезный хотя спасибо.
Может быть, Devel :: DumpSizes
и / или Devel :: Size
могут помочь? Я думаю, что первое было бы более полезно в вашем случае.
Devel :: DumpSizes - Вывести имя и размер в байтах (в порядке возрастания) переменных, которые доступны в заданной точке сценария.
Devel :: Size - Расширение Perl для определения использования памяти переменными Perl
Вот некоторые общие ресурсы по проблемам памяти в Perl:
Что касается вашего собственного предположения, то самым простым способом опровержения будет написание простой Perl-программы, которая:
Создает большой (100M) файл обычного текста, возможно, просто выводя одну и ту же строку в цикле в файл, или для бинарных файлов выполняя команду dd
через system()
вызов
Читает файл, используя стандартный Perl open()/@a=<>;
Измеряет потребление памяти.
Затем повторите #2-#3 для вашего 800M файла.
Это покажет вам, в чем проблема: в File::Slurp, в странной логике вашей программы или в специфическом содержимом файла (например, неаскрипт, хотя я буду удивлен, если это окажется причиной)
.