2013-11-21 4 views
7

Мой сценарий выполняет следующиеPerl скрипт странное поведение/регенерацией памяти

  1. читает огромный текстовый файл и создает хэш от него. (О 24million простой ключ-значения pairs.Takes около 5 минут и потребляет на 92% компьютерной памяти 4Gb)
  2. Запускает моделирование с использованием информации из хэша. (принимает около 30minutes)
  3. печатает результаты в конце моделирования (в файл и стандартный вывод)

Тогда ждет для Через 10 минут после последнего заявления печати и выхода. Ожидание в конце не происходит каждый раз. Во время ожидания команда top показывает то же 92% использование памяти, но без использования процессора. Почему это происходит иногда после его завершения? Если я ударил CtrlC, он немедленно выходит без каких-либо изменений в результатах (результатах). Как я отлаживаю это или ожидаемое поведение, поскольку хеш огромен?

EDIT

Можно ли вернуть некоторую память на лету, удалив ненужные ключ - пары значений из хэша?

+8

Значительная часть вашей проблемы может быть замедленной из-за замены. Время, затраченное на конец, может быть связано с разрушением вашей структуры данных. 'POSIX :: _ exit (0)' будет обходить очистку. – ikegami

+0

Если я обойду очистку, ОС не восстановит память? Это хорошая практика? Если я запустил его в системе с большим объемом памяти, эта проблема исчезнет? – Jean

+3

ОС вернет память. Это не хорошая практика, так как деструкторы не будут вызваны. Да, если это проблема обмена, как я предполагаю. – ikegami

ответ

1

Я предполагаю, что вы знаете, «удалить» функцию (так удаляется ссылка на perldoc -f удалить :)

Для памяти отладки вы можете использовать Valgrind Также этот намек может быть полезным: Does Perl v5.10.1 have memory leaks or how to interpret valgrind Он предлагает использовать:

использование Perl :: Destruct :: Level level => 1;

Смежные вопросы