Проблема с Batch

Главные вкладки

Аватар пользователя sp33d sp33d 9 июля 2012 в 19:32

Для импорта товаров из больших прайсов (2000+ с загрузкой картинок) решил использовать BatchAPI. Загрузка 20-25 товаров проходит примерно за минуту (без batch раза в 3 быстрее) - ладно, мелочи. А когда я попробовал загрузить прайс на 2300 позиций - импорт одной позиции затянулся на 5 минут (100 позиций - примерно 2 минуты на позицию)! В чем тут может быть дело?

Комментарии

Аватар пользователя Shok211 Shok211 9 июля 2012 в 20:34

Дело в том что батчу тоже надо куда-то сохранять данные которые будут вытянуты во время процесса. Поэтому 5 минут это примерно тот интервал который требуется для записи всех данных. Ко всему прочему вы постоянно извлекаете все поля из sql по таблице продуктов и если у вас до этого было большое кол-во продуктов то логично что такая операция будет довольно время затратной (Возможно их мало тогда это не должно сильно влиять).

Первое что бросилось в глаза.
Второе непонятны характеристики вашего сервера.

Аватар пользователя Hinikato Hinikato 9 июля 2012 в 20:53

Может быть жесткий медленный на сервере, у меня такое было, если у вас VPS, можете проверить с помощью hdparm, как-то так, примерно:
hdparm -Tt /dev/девайс
должно быть хотя бы 30 MB/sec, а лучше больше

Аватар пользователя sp33d sp33d 10 июля 2012 в 14:53

Это все делается на локальной машине (денвер).

5 минут - это одна позиция импортилась. А сколько потребовалось бы на 2300 - можете сами посчитать. Я не ждал.
Я пробовал отрубить вообще весь процесс запросов, закачек, внутренних циклов и т.п. Т.е. оставил пустую функцию со счетчиком. Скорость увеличилась не больше чем в 2 раза. Т.е. простой счет до 2300 с итерацией за 2 минуты.

Аватар пользователя sg85 sg85 14 июля 2012 в 12:25

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

Смог посмотреть файл со смартфона... лучше бы этого не делал...

В общем читать все лень, однако сразу в глаза бросилось подключение файлов в том числе CSS в основном коде, т.е. они будут вызываться всегда, даже на главной странице у анонимусов а так же сам файл inc, в 6 друпале был такой момент, что приходилось инклудить файлы с пакетниками в основном коде, иначе они просто висли, однако терялся всякий смысл выносить их в отдельные файлы, хотя может это у меня руки кривые

Аватар пользователя Orion76 Orion76 14 июля 2012 в 13:00

Если мне не изменяет память..
У вас алгоритм "формирования" bath-операции и выполнения не правильный
swu_import_import_quick - получается, что у вас за одну итерацию грузиться одна нода.. а одна итерация длиться вроде секунд 5-15(вызов функции загрузки(swu_import_import_quick) через 5-15 сек)..
Так что получается, даже без реального импорта время работы bath = 2300 х (время на одну итерацию)

Аватар пользователя sp33d sp33d 14 июля 2012 в 20:08

А какой правильный?

Когда я весь цикл загрузки переместил в swu_import_import_quick, все делалось быстро, но без обновления процесса. Как я понял, обновление процесса происходит в конце batch-итерации

Аватар пользователя Orion76 Orion76 14 июля 2012 в 21:06

при формировании данных для bath (сабмит формы загрузки) все данные помещаем в один массив $values:
т.е. 1 нода = 1 элемент массива (получиться одна операция )
А в функции swu_import_import_quick уже циклом по $values грузим данные, 1 проход цикла - 1 нода.. $context['sandbox']['progress'] - индекс текущего элемента $values..

цикл - пока $context['sandbox']['progress'] меньше count($values)

Аватар пользователя sp33d sp33d 15 июля 2012 в 15:44

Я не спорю, работать это будет, но обновления процесса не произойдет.
Я делал цикл с обновлением $context['sandbox']['progress'] после каждой операции цикла, но это ничего не давало. Пока функция swu_import_import_quick не завершалась, процесс стоял на 0. А потом сразу скачок на 100% и все.