Ответ 1
Проблема, с которой вы сталкиваетесь, - это не какой-то произвольный лимит в Cygwin, который вы можете уйти с изменением настроек. Это неотъемлемый аспект того, как Cygwin должен работать, чтобы получить построенные под ним программы семантики POSIX.
Системный вызов POSIX fork()
не имеет собственного эквивалента в Windows, поэтому Cygwin вынужден эмулировать его в очень неэффективный способ. Сценарии оболочки вызывают вызов fork()
каждый раз, когда они выполняют внешний процесс, что происходит довольно много, поскольку языки оболочки script настолько бедны относительно того, что мы обычно называем языком программирования. Внешние программы - это то, как скрипты оболочки получают все, что было сделано.
В Cygwin есть другие недостатки, хотя, если вы их профилировали, вы, вероятно, обнаружите, что скорость номер один. В большинстве мест слой Cygwin между программой, созданной с использованием ее и базовой ОС, довольно тонкий. Разработчики Cygwin прилагают много усилий, чтобы сохранить слой как можно более тонким, сохраняя при этом правильную семантику POSIX. Нынешняя необычная толщина в эмуляции вызова fork()
неизбежна, если Microsoft не добавит встроенную среду типа fork()
для своей ОС. Их стимулы для этого не очень хорошие.
Решения, опубликованные выше в качестве комментариев, неплохие.
Другая возможность - пройти через drush
script и посмотреть, есть ли вызовы внешних программ, которые вы можете заменить оболочкой или более эффективными конструкциями. Я бы не ожидал огромного улучшения скорости, сделав это, но у него есть приятное свойство, которое вы также ускорите на стороне Linux. (fork()
эффективен для Linux, но запуск внешних программ по-прежнему является большим быстродействием, что вам, возможно, не придется платить так часто, как вы сейчас делаете.) Например:
numlines=`grep somepattern $somefile | wc -l`
if [ $numlines -gt 0 ] ; then ...
будет работать быстрее:
if grep -q somepattern $somefile ; then ...
Первая версия, возможно, понятна, но для нее требуется, по крайней мере, три внешних вызова программы, а с примитивными оболочками - четыре. (Вы видите их все?) Для замены требуется только один вызов внешней программы.