Несколько других и я сейчас счастливые сопровождающие нескольких старых пакетных заданий, написанные на 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.
32-разрядная версия perl на Solaris будет хранить около 3,7 ГБ независимо от того, какая память имеет система. – mob
Применяются все общие рекомендации о нераспространении и т. Д. Однако, пожалуйста, покажите хотя бы общую структуру хэша. Если у вас сложная структура данных, посмотрите, не можете ли вы преобразовать некоторые из массива или hashrefs в строки, которые вы расширяете по мере необходимости. –
Вы можете попробовать «привязать хэш к объекту [' DBM :: Deep'] (https://metacpan.org/pod/DBM::Deep#Tie-Construction). Однако обязательно прочитайте предупреждения о бесконечных циклах в документах. – ThisSuitIsBlackNot