Сокращение перемещаемого Win32 Perl до максимально возможного количества файлов и байтов

Я пытаюсь использовать Perl-программу на вычислительном кластере Windows HTCondor. HTCondor в Windows работает так, как будто копирует все зависимости во временный каталог (используется как chroot из сортов), а затем удаляет каталог после перемещения указанных выходов в указанное место.

Если я возьму только perl.exe и perl514.dll и сделаю такую ​​работу: perl -e "print qq/hello\n/" и попросите кластер запустить его 200 раз, после чего каждая репликация запускается примерно за 15 секунд, что является приемлемым расходом. Это почти все время, затрачиваемое на многократное копирование файлов по сети, а затем их удаление. echo_hello.bat запуск 200 раз занимает больше двух секунд на репликацию.

Проблема, с которой я столкнулся, заключается в том, что когда я пытаюсь использовать свое полное распространение perl 55 МБ и 2289 файлов, один "привет" повтор занимает около четырех минут на копирование и удаление, что недопустимо. Когда я пытаюсь выполнить много прогонов, диски на машинах останавливаются, пытаясь одновременно обрабатывать все файловые операции во всех повторениях, так что это не работает вообще. Я не знаю, сколько времени может потребоваться, чтобы в конце концов закончить, потому что я сдался через полчаса, а работа не была закончена.

Я полагал, что PAR::Packer мог бы решить проблему, но нет. Я старался print_hello.exe создано так: pp -o print_hello.exe -e "print qq/hello\n/", Это по-прежнему останавливает работу, очевидно, из-за заваления файловой системы. Я думаю, что исполняемый файл PAR::Packer создает тонну временных файлов, поскольку он извлекает нужные файлы из архива. Я думаю, что файловая система Windows полностью задыхается, когда есть множество одновременных небольших файловых операций.

Итак, как я могу сократить сборку Perl до 6MB и дюжины файлов? Я на самом деле только небольшое количество основных модулей, и мне не нужно много дерьма в bin а также lib, но я понятия не имею, как продолжать вырывать вещи в здравом уме.

Существует ли автоматический способ удаления ненужных файлов и модулей?

Я знаю, что в TCL есть множество возможностей для упаковки файлов в один несжатый архив, к которому затем можно получить доступ через "виртуальную файловую систему", не раскрывая файл. Есть ли способ сделать это с самим Perl вроде как с PAR? Проблема в том, что PAR сжимает все и затем должен извлекать во временные файлы, а не напрямую работать через слой виртуальной файловой системы. (Если я правильно понимаю.)

Мое использование Perl на самом деле в качестве слоя сценариев. Это встроено в симуляцию. Так что я действительно запускаю my_simulation.exe, который зависит от per514.dll, но вы поняли идею. Я также не могу реально ничего сделать с кластером HTCondor, кроме как использовать его. Так что нет необходимости думать нестандартно о том, что я должен использовать вместо Perl и что я могу административно настроить в Windows и HTCondor, спасибо.

2 ответа

Решение

Вы можете использовать Module:: ScanDeps, чтобы получить список фактических зависимостей вашего perl. Было ужасно, что это заняло значительное количество времени, когда PAR::Packer распаковал все приложение, поэтому я решил собрать исполняемый файл сам.

Вот мой готовый скрипт, который собирает зависимости perl в какой-то каталог; для вас может быть полезно уменьшить количество perl-модулей, например, вручную удалив некоторые зависимости после копирования.

Теоретически (я никогда не пробовал этого) следующим шагом может быть объединение всех зависимостей чистого perl в один файл (например, deps.pm); хотя это может быть нетривиально из-за магии автозагрузки perl и некоторых других трюков.

Вы можете перечислить модули, которые нужны вашей программе, используя очень хороший ListDependencies модуль

Насколько мне известно, он нигде не загружается, но его просто скопировать и вставить в свой ListDependencies.pm файл

Вы должны прочитать документацию POD в модуле для инструкций по использованию

Другие вопросы по тегам