2017-01-31 4 views
5

Этот вопрос возникает, когда я замечаю, что мой скрипт начинает останавливаться и останавливаться, когда он в цикле записи содержимого в файл. Сначала я проверяю свою память и вижу тенденцию, что это происходит, когда моя операционная система уменьшилась примерно до 2-3%. Затем я просматриваю свой блок кода, который потребляет ОЗУ, и полагал, что по мере того, как скрипт продолжает подавать контент в файл, он растет в размере, который также занимает память. Вот код, который делает создание файла:Почему Perl занимает мою память (ОЗУ) при печати файла?

open (my $fh, '>>', $filePath); 
while (my $row = $sth->fetchrow_hashref) { 
    print $fh join ('|', $row->{name}, $row->{address}) "\n"; 
} 

Если я раскомментируйте оператор печати и запустить скрипт, моя память не будет уменьшаться. Итак, я уверен, что память RAM занята FILEHANDLE/что-то еще за Perl, которое занимает память. Это приводит меня к вопросу, если есть способ написать файл из Perl-скрипта на диск, вместо использования RAM памяти?

  • Я попытался промыть FILEHANDLE на каждом ряду, и он все еще не работает.
  • Одна вещь, которая также очень странная, заключается в том, что после того, как я завершаю свой скрипт, я смотрю на свою память и все еще берусь за файлы. И когда я удаляю файлы, он освобождает мою память. Я использую free в linux, чтобы проверить свою память.

Am I checking my memory usage at the right place here ?

+0

Можете ли вы обновить свой вопрос с помощью сценария? Он должен работать. – choroba

+0

Это может быть [дубликат] (http://stackoverflow.com/questions/1242832/in-perl-how-can-i-release-memory-to-the-operating-system), но я действительно не понять вопрос. – mob

+0

Отредактировал мой вопрос, чтобы добавить более подробную информацию по этому вопросу. Надеюсь, это объяснит проблему намного яснее. – kelvien

ответ

7

Итак, ответ на ваш вопрос «Почему Perl берет мою RAM при печати файла?» что Perl не использует память. Кэш файловой системы операционной системы использует память.

Ваш сценарий Perl написал большой файл. Сначала он входит в кеш-файл в ОЗУ, операционная система обходит его, записывая его на диск, когда у него есть время или когда у него заканчивается ОЗУ. Он не удаляет его из ОЗУ, если вы не удаляете файл, или ему требуется ОЗУ для чего-то другого.

Файловый кеш - неплохая вещь, и вам не стоит беспокоиться о том, сколько из нее использует ваша оперативная память. Когда программе требуется больше памяти, ОС может быстро очистить кеш-файл и повторно использовать память для вашей программы.

+0

Спасибо, Zan. Моя забота была на самом деле из-за того, что я увидел, что забор закрывается и возобновляется периодически, когда я вижу, что поле «Свободное» на 'free' занимает около 2-3%. Он становится заметно медленнее. – kelvien

+1

KelvienHidayat: Если это была ваша забота, вы должны были упомянуть об этом в своем вопросе. Каковы эти * fetchrow halts *, о которых вы говорите. Все будет заметно медленнее, если ваша память опустится до 2% бесплатно, но вы не упомянули об этом. Одно можно сказать наверняка: это не печать на Perl, которая использует пространство. Вам нужно предоставить гораздо больше информации, например, о содержании вашей программы. – Borodin

+1

@ KelvienHidayat, когда ОС не хватает места для записи в память диска, поэтому он должен остановить вашу программу от выпуска, пока она не сможет свернуть часть диска. Другими словами, то, что вы видите, является нормальным эффектом вашей программы, производящей выход быстрее, чем ваш диск может записать его. – hobbs

5

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

В случае, если вам интересно, каждый дескриптор файла имеет буфер 4 KiB или 8 KiB, в зависимости от вашей версии Perl.