Как быть с "тяжелым" консольным скриптом

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
lavrik
Сообщения: 110
Зарегистрирован: 2013.03.02, 21:41
Контактная информация:

Как быть с "тяжелым" консольным скриптом

Сообщение lavrik »

Вопрос наверное глупый, но все же...

Есть консольный скрипт, прогружающий большой прайс лист (ищет новинки, удаляет старые, обновляет цены и пр.).
Запускается по крону, работает около 20 минут.

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

Кстати, на моем компе все отлично, но он гораздо мощнее ВДС-а,который я купил.

Какие есть варианты решения?

Из придуманных мной:
1) сделать копию приложения на своем компе, настроить подключение к удаленный базе и запускать прогрузку прайса "от себя". (не хочу вести сайт в двух местах)
2) купить отдельный хост для этого (опять-же два места)
3) купить ВДС мощнее... (очень дорого)

Может я что-то не правильно сделал???
lavrik-v.ru - моя напоминалка по php.
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Как быть с "тяжелым" консольным скриптом

Сообщение vitalik1183 »

оптимизацию уже всю провели? что у вас за прайс лист который 20 минут формируется? сколько делал прайсов, в которых по 15 вкладок и в итоге под 180к наименований - формировалось за 3-5 секунд.

а, прошу прощения, вы прогружаете. все равно что то долго. подозреваю, что нужно провести оптимизацию вашего кода ;)
Yii2!
YunX
Сообщения: 87
Зарегистрирован: 2011.07.06, 12:53

Re: Как быть с "тяжелым" консольным скриптом

Сообщение YunX »

lavrik писал(а):Запускается по крону, работает около 20 минут.

Кстати, на моем компе все отлично, но он гораздо мощнее ВДС-а,который я купил.
отлично - это сколько времени?
lavrik
Сообщения: 110
Зарегистрирован: 2013.03.02, 21:41
Контактная информация:

Re: Как быть с "тяжелым" консольным скриптом

Сообщение lavrik »

vitalik1183 писал(а):оптимизацию уже всю провели? что у вас за прайс лист который 20 минут формируется? сколько делал прайсов, в которых по 15 вкладок и в итоге под 180к наименований - формировалось за 3-5 секунд.

а, прошу прощения, вы прогружаете. все равно что то долго. подозреваю, что нужно провести оптимизацию вашего кода ;)
проверяется 5 прайсов по +50к записей...
Код оптимизирован по максимуму...

Прайсы обрабатываются потоково, через XMLReader.

Если в двух словах, по запросам к БД то на каждый товар:
1) Делаю апдейт цены, наличия в БД по индексу
2) Если число затронутых строк == 0, делаю инсерт этого товара в БД.

По моему и так все по максимуму оптимально.

На локалке это 2-3 минуты. На хосте 20-30 минут.
lavrik-v.ru - моя напоминалка по php.
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Как быть с "тяжелым" консольным скриптом

Сообщение vitalik1183 »

вы делайте 250к запросов к бд?
Yii2!
lavrik
Сообщения: 110
Зарегистрирован: 2013.03.02, 21:41
Контактная информация:

Re: Как быть с "тяжелым" консольным скриптом

Сообщение lavrik »

vitalik1183 писал(а):вы делайте 250к запросов к бд?
Как по другому?
lavrik-v.ru - моя напоминалка по php.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как быть с "тяжелым" консольным скриптом

Сообщение zelenin »

lavrik писал(а):
vitalik1183 писал(а):вы делайте 250к запросов к бд?
Как по другому?
ну например разбить на чанки по 1000 товаров. делаем один запрос на проверку 1000 цен, вернутся id товаров, у которых цена не поменялась. Делаем array_diff и оставшиеся цены апдейтим.
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Как быть с "тяжелым" консольным скриптом

Сообщение vitalik1183 »

Как по другому?
тогда неудивительно что на виртуале все умирает. batchInsert вам в помощь
Yii2!
lavrik
Сообщения: 110
Зарегистрирован: 2013.03.02, 21:41
Контактная информация:

Re: Как быть с "тяжелым" консольным скриптом

Сообщение lavrik »

zelenin писал(а):
lavrik писал(а):
vitalik1183 писал(а):вы делайте 250к запросов к бд?
Как по другому?
ну например разбить на чанки по 1000 товаров. делаем один запрос на проверку 1000 цен, вернутся id товаров, у которых цена не поменялась. Делаем array_diff и оставшиеся цены апдейтим.

Идею понял, за ней собственно и пришел сюда))))
Буду докуривать скрипт...

Спасибо, если интересно, потом отпишусь о результатах.
lavrik-v.ru - моя напоминалка по php.
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Как быть с "тяжелым" консольным скриптом

Сообщение mkramer »

Может попробовать insert ... on duplicate key update? И объединять в чанки, как советовал zelenin. Подключить к этому делу batchInsert в целом не сложно: https://github.com/yiisoft/yii2/issues/ ... t-97088457
lavrik
Сообщения: 110
Зарегистрирован: 2013.03.02, 21:41
Контактная информация:

Re: Как быть с "тяжелым" консольным скриптом

Сообщение lavrik »

mkramer писал(а):Может попробовать insert ... on duplicate key update? И объединять в чанки, как советовал zelenin. Подключить к этому делу batchInsert в целом не сложно: https://github.com/yiisoft/yii2/issues/ ... t-97088457
Возник вопрос:
Если я в batchInsert() накидаю 50 тысяч товаров, он их все за раз пошлет в базу или частями сам разобьет?

Или может мне самому стоит накидывать не больше 1000 штук?
lavrik-v.ru - моя напоминалка по php.
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Как быть с "тяжелым" консольным скриптом

Сообщение vitalik1183 »

если сервер прокачает то примет все, но лучше разбить ибо судя по описанию ваш виртуал стока не проглотит)
Yii2!
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как быть с "тяжелым" консольным скриптом

Сообщение zelenin »

lavrik писал(а):
mkramer писал(а):Может попробовать insert ... on duplicate key update? И объединять в чанки, как советовал zelenin. Подключить к этому делу batchInsert в целом не сложно: https://github.com/yiisoft/yii2/issues/ ... t-97088457
Возник вопрос:
Если я в batchInsert() накидаю 50 тысяч товаров, он их все за раз пошлет в базу или частями сам разобьет?

Или может мне самому стоит накидывать не больше 1000 штук?
одним запросом отправит.

но вам надо товары сначала отфильтровать на новые, старые с неизменившейся ценой и старые с изменившийся ценой.
lavrik
Сообщения: 110
Зарегистрирован: 2013.03.02, 21:41
Контактная информация:

Re: Как быть с "тяжелым" консольным скриптом

Сообщение lavrik »

zelenin писал(а): но вам надо товары сначала отфильтровать на новые, старые с неизменившейся ценой и старые с изменившийся ценой.
Это само-собой... Просто возник вопрос, на который я не нашел ответ в доке...
lavrik-v.ru - моя напоминалка по php.
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Как быть с "тяжелым" консольным скриптом

Сообщение mkramer »

zelenin писал(а):
но вам надо товары сначала отфильтровать на новые, старые с неизменившейся ценой и старые с изменившийся ценой.
А собственно, зачем? Что плохого в том, что insert .. on duplicate key update перезапишет и неизменившиеся цены? Если по 1000 делать, это всё равно быстрые запросы будут довольно. Мне просто интересно, может я и не прав
lavrik
Сообщения: 110
Зарегистрирован: 2013.03.02, 21:41
Контактная информация:

Re: Как быть с "тяжелым" консольным скриптом

Сообщение lavrik »

mkramer писал(а):
zelenin писал(а):
но вам надо товары сначала отфильтровать на новые, старые с неизменившейся ценой и старые с изменившийся ценой.
А собственно, зачем? Что плохого в том, что insert .. on duplicate key update перезапишет и неизменившиеся цены? Если по 1000 делать, это всё равно быстрые запросы будут довольно. Мне просто интересно, может я и не прав
on duplicate key - работает по ключевому полю. А у меня поиск идет по id_товара_поставщика + name_поставщика

Сами подумайте: У меня в базе свои id, которые != id поставщика (т.к. поставщиков много)
Поэтому я храню ИХ id + ИХ name.
lavrik-v.ru - моя напоминалка по php.
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: Как быть с "тяжелым" консольным скриптом

Сообщение mkramer »

on duplicate key на любой ключ можно настроить, не только на primary. У меня на многих проектов, которые на unique ключах работают. В любом случае, тогда вам надо сначала считать из базы все ваши пары "id товара => ваш ключ" в массив какой-нибудь, и искать в нём, а не по базе. Поскольку дофига селектов - очень медленное. У меня, в начале моей карьеры, был подобный скрипт, который опытный коллега ускорил так, что с 6 часов время работы сократилось до 15 минут, именно таким образом
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как быть с "тяжелым" консольным скриптом

Сообщение zelenin »

mkramer писал(а):
zelenin писал(а):
но вам надо товары сначала отфильтровать на новые, старые с неизменившейся ценой и старые с изменившийся ценой.
А собственно, зачем? Что плохого в том, что insert .. on duplicate key update перезапишет и неизменившиеся цены? Если по 1000 делать, это всё равно быстрые запросы будут довольно. Мне просто интересно, может я и не прав
я мыслю универсальными понятиями, а также не работаю с mysql, поэтому ваше "mysql по умолчанию" мне смешно и мною не рассматривается.
А главное в моем комменте - идея. Реализация может отличаться.
lavrik
Сообщения: 110
Зарегистрирован: 2013.03.02, 21:41
Контактная информация:

Re: Как быть с "тяжелым" консольным скриптом

Сообщение lavrik »

Если кому интересно, то я переделал все как вы посоветовали (через array_diff-ы и batchInsert - ы).

Раньше полная прогрузка всех прайсов занимала около 20 минут и ело 150 мб. памяти.
Теперь - 4 минуты, 4,5 мб. памяти)))
lavrik-v.ru - моя напоминалка по php.
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Как быть с "тяжелым" консольным скриптом

Сообщение vitalik1183 »

хоть на гитхаб выложи, уверен, что кто нить подскажет как оптимизировать еще быстрее ;)
Yii2!
Ответить