Как ускорить работу Batch API?

12

Я сталкивался с этим как с сторонними модулями, так и с некоторыми из моих собственных операций. Мне интересно, как можно ускорить пакетные операции моего / contrib ?

Предположим, они работают с узлами (импорт / обновление и т. Д.), И мы имеем дело с разбором списков узлов в диапазоне более 10000 (хотя мне приходилось иметь дело с 15 миллионами строк ... что да - я просто облажался. .)

Это быстрее, чтобы прикрепить к заданию drupals cron.php и запустить "без головы"? Используя Drush? или это просто вопрос того, насколько эффективно и быстро я могу разработать свой код, и нет никаких внешних влияний или конкретных советов по оптимизации ...

В настоящее время я столкнулся с операциями, которые (используя некоторые грубые вычисления) могли занять более 24 часов ...

Благодарность!

electblake
источник

Ответы:

9

Это не работает для кода contrib, но если это ваш код, и вы хорошо его знаете, я рекомендую написать команду drush, чтобы выполнить эту работу. В рамках drush ограничьте drupal_bootstrap () соответствующим уровнем начальной загрузки. Я не могу вспомнить действительные числа, но очень большой процент времени для каждого запроса друпала тратится в начальной загрузке, и вы можете сэкономить там много времени.

Кроме того, проверьте внутренности модуля Migrate. Я не знаю, как это работает, это mojo (никогда не тянул время, чтобы заткнуть его), но он может прорваться сквозь огромные партии узлов очень быстро.

вовремя
источник
Спасибо за вклад - я буду больше изучать модуль переноса, и что drupal_boostrap также был отличным
советом
8

Каждый пакетный вызов - это HTTP-запрос. Поэтому вам нужно найти идеальное сочетание того, сколько итераций вы можете обработать, прежде чем будет запущен другой HTTP-запрос. Следует учитывать две вещи: память и максимальное время выполнения. Вы захотите обработать как можно больше итераций для каждого пакета, чтобы уменьшить количество HTTP-запросов, поскольку они, скорее всего, являются причиной вашего медленного пакета.

Если ваш пакет слишком тяжел для эффективной работы, вы можете вместо этого попробовать использовать очередь. Здесь есть хорошая презентация «партия против очереди» http://sf2010.drupal.org/conference/sessions/batch-vs-queue-api-smackdown . Очереди не обеспечивают обратную связь с пользователем и могут выполняться параллельно.

Если вам требуется обратная связь с пользователем, вы привязаны к пакету, но вы можете даже использовать очередь в своем пакете, чтобы попытаться оптимизировать ее.

Jepedo
источник
2

Как уже говорили другие, Drush - хорошее решение, но очередь - отличный инструмент для использования. Пакетный API в Drupal 7 использует встроенное ядро ​​API очереди, поэтому, если вы используете MySQL, ваш процесс может оказаться там узким местом. Но API очереди Drupal 7 является подключаемым, поэтому вы можете использовать другую систему очередей, такую ​​как beanstalkd.

bjeavons
источник
1

Если вы можете сделать это параллельно, это хорошее начало. Вот некоторые из моих мыслей по этому поводу, поскольку я использовал 4 потока, чтобы пролистать более миллиона страниц раньше (с помощью надстройки). Смотря, чтобы сделать это обобщенным сейчас. http://groups.drupal.org/node/126624

mikeytown2
источник