2015-04-09 2 views
3

Несколько других и я сейчас счастливые сопровождающие нескольких старых пакетных заданий, написанные на Perl. Около 30 тыс. Строк кода, разделенных, возможно, 10-15 файлами Perl.Perl «Недостаточно памяти!» при обработке большого пакетного задания

У нас есть много долгосрочных исправлений для улучшения работы пакетного процесса, но в краткосрочной перспективе мы должны поддерживать подсветку для различных других проектов, которые зависят от вывода этих пакетных заданий.

В основе основной части этих пакетных заданий лежит хэш, загружаемый кучей данных, собранных из различных файлов данных в связке каталогов. Когда они были впервые написаны, все хорошо вписывалось в память - не более 100 МБ или около того. Вещи, конечно, вырос за эти годы, и хэш в настоящее время растет до того, что коробка может обрабатывать (8 ГБ), оставляя нас с хорошим сообщением с Perl:

Out of memory!

Это, конечно, бедный дизайн для пакетной работы, и у нас есть четкая (долгосрочная) дорожная карта для улучшения процесса.

У меня есть два вопроса, однако:

  • Какие краткосрочные варианты мы можем смотреть на, короткие бросать больше памяти на машине? Какие настройки ОС можно настроить? Можно ли установить флаги времени выполнения/компиляции Perl?
  • Я также хотел бы понять, ПОЧЕМУ Perl падает с «из памяти!». в отличие от использования пространства подкачки, которое доступно на машине.

Для справки, это работает на Sun SPARC M3000, работающем на Solaris 10 с 8 ядрами, 8 ГБ оперативной памяти, 10 Гбайт подкачки.

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

Долгосрочное решение, конечно, рефакторинг многих кодовых баз и переход на Linux на x86.

+2

32-разрядная версия perl на Solaris будет хранить около 3,7 ГБ независимо от того, какая память имеет система. – mob

+1

Применяются все общие рекомендации о нераспространении и т. Д. Однако, пожалуйста, покажите хотя бы общую структуру хэша. Если у вас сложная структура данных, посмотрите, не можете ли вы преобразовать некоторые из массива или hashrefs в строки, которые вы расширяете по мере необходимости. –

+1

Вы можете попробовать «привязать хэш к объекту [' DBM :: Deep'] (https://metacpan.org/pod/DBM::Deep#Tie-Construction). Однако обязательно прочитайте предупреждения о бесконечных циклах в документах. – ThisSuitIsBlackNot

ответ

0

На самом деле не существует общеприменимых методов уменьшения объема памяти программы; кому-то знакомы с Perl, чтобы отсканировать код и найти что-то, что подходит для вашей конкретной ситуации.

Возможно, вы обнаружили, что хранение хеша в качестве базы данных на основе диска помогает, и более общим способом является использование Tie::Hash::DBD, что позволит вам использовать любую базу данных, поддерживаемую DBI, но это не поможет с хешами, значения которых могут быть ссылками, например, вложенными хешами. (Как ThisSuitIsBlackNot прокомментировал, DBM::Deep преодолевает даже это препятствие.)

Я предполагаю, что ваш код Perl рушится при запуске? Если у вас есть утечка памяти, тогда вам будет проще найти причину. В качестве альтернативы, для вас может быть очевидным, что первоначальная популяция хэша является расточительной, поскольку она хранит данные, которые никогда не будут использоваться. Если вы покажете эту часть своего кода, я уверен, что кто-то сможет помочь

0

Попробуйте использовать 64-битную версию интерпретатора. У меня была такая же проблема с сообщением «Без памяти». В моем случае 32-битная земляника perl с 2 ГБ оперативной памяти до окончания. 64-битная версия интерпретатора может использовать большую сумму. Он съел остальную часть моего 16Gb и начал обмениваться, как ад. Но я получил результат.

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