Как быть с "тяжелым" консольным скриптом
Как быть с "тяжелым" консольным скриптом
Вопрос наверное глупый, но все же...
Есть консольный скрипт, прогружающий большой прайс лист (ищет новинки, удаляет старые, обновляет цены и пр.).
Запускается по крону, работает около 20 минут.
Проблема в том, что во время его работы сам сайт тупит, можно сказать лежит.
Кстати, на моем компе все отлично, но он гораздо мощнее ВДС-а,который я купил.
Какие есть варианты решения?
Из придуманных мной:
1) сделать копию приложения на своем компе, настроить подключение к удаленный базе и запускать прогрузку прайса "от себя". (не хочу вести сайт в двух местах)
2) купить отдельный хост для этого (опять-же два места)
3) купить ВДС мощнее... (очень дорого)
Может я что-то не правильно сделал???
Есть консольный скрипт, прогружающий большой прайс лист (ищет новинки, удаляет старые, обновляет цены и пр.).
Запускается по крону, работает около 20 минут.
Проблема в том, что во время его работы сам сайт тупит, можно сказать лежит.
Кстати, на моем компе все отлично, но он гораздо мощнее ВДС-а,который я купил.
Какие есть варианты решения?
Из придуманных мной:
1) сделать копию приложения на своем компе, настроить подключение к удаленный базе и запускать прогрузку прайса "от себя". (не хочу вести сайт в двух местах)
2) купить отдельный хост для этого (опять-же два места)
3) купить ВДС мощнее... (очень дорого)
Может я что-то не правильно сделал???
lavrik-v.ru - моя напоминалка по php.
- vitalik1183
- Сообщения: 1675
- Зарегистрирован: 2014.07.01, 08:42
Re: Как быть с "тяжелым" консольным скриптом
оптимизацию уже всю провели? что у вас за прайс лист который 20 минут формируется? сколько делал прайсов, в которых по 15 вкладок и в итоге под 180к наименований - формировалось за 3-5 секунд.
а, прошу прощения, вы прогружаете. все равно что то долго. подозреваю, что нужно провести оптимизацию вашего кода
а, прошу прощения, вы прогружаете. все равно что то долго. подозреваю, что нужно провести оптимизацию вашего кода
Yii2!
Re: Как быть с "тяжелым" консольным скриптом
отлично - это сколько времени?lavrik писал(а):Запускается по крону, работает около 20 минут.
Кстати, на моем компе все отлично, но он гораздо мощнее ВДС-а,который я купил.
Re: Как быть с "тяжелым" консольным скриптом
проверяется 5 прайсов по +50к записей...vitalik1183 писал(а):оптимизацию уже всю провели? что у вас за прайс лист который 20 минут формируется? сколько делал прайсов, в которых по 15 вкладок и в итоге под 180к наименований - формировалось за 3-5 секунд.
а, прошу прощения, вы прогружаете. все равно что то долго. подозреваю, что нужно провести оптимизацию вашего кода
Код оптимизирован по максимуму...
Прайсы обрабатываются потоково, через XMLReader.
Если в двух словах, по запросам к БД то на каждый товар:
1) Делаю апдейт цены, наличия в БД по индексу
2) Если число затронутых строк == 0, делаю инсерт этого товара в БД.
По моему и так все по максимуму оптимально.
На локалке это 2-3 минуты. На хосте 20-30 минут.
lavrik-v.ru - моя напоминалка по php.
- vitalik1183
- Сообщения: 1675
- Зарегистрирован: 2014.07.01, 08:42
Re: Как быть с "тяжелым" консольным скриптом
Как по другому?vitalik1183 писал(а):вы делайте 250к запросов к бд?
lavrik-v.ru - моя напоминалка по php.
Re: Как быть с "тяжелым" консольным скриптом
ну например разбить на чанки по 1000 товаров. делаем один запрос на проверку 1000 цен, вернутся id товаров, у которых цена не поменялась. Делаем array_diff и оставшиеся цены апдейтим.lavrik писал(а):Как по другому?vitalik1183 писал(а):вы делайте 250к запросов к бд?
- vitalik1183
- Сообщения: 1675
- Зарегистрирован: 2014.07.01, 08:42
Re: Как быть с "тяжелым" консольным скриптом
тогда неудивительно что на виртуале все умирает. batchInsert вам в помощьКак по другому?
Yii2!
Re: Как быть с "тяжелым" консольным скриптом
zelenin писал(а):ну например разбить на чанки по 1000 товаров. делаем один запрос на проверку 1000 цен, вернутся id товаров, у которых цена не поменялась. Делаем array_diff и оставшиеся цены апдейтим.lavrik писал(а):Как по другому?vitalik1183 писал(а):вы делайте 250к запросов к бд?
Идею понял, за ней собственно и пришел сюда))))
Буду докуривать скрипт...
Спасибо, если интересно, потом отпишусь о результатах.
lavrik-v.ru - моя напоминалка по php.
Re: Как быть с "тяжелым" консольным скриптом
Может попробовать insert ... on duplicate key update? И объединять в чанки, как советовал zelenin. Подключить к этому делу batchInsert в целом не сложно: https://github.com/yiisoft/yii2/issues/ ... t-97088457
Re: Как быть с "тяжелым" консольным скриптом
Возник вопрос: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: Как быть с "тяжелым" консольным скриптом
если сервер прокачает то примет все, но лучше разбить ибо судя по описанию ваш виртуал стока не проглотит)
Yii2!
Re: Как быть с "тяжелым" консольным скриптом
одним запросом отправит.lavrik писал(а):Возник вопрос:mkramer писал(а):Может попробовать insert ... on duplicate key update? И объединять в чанки, как советовал zelenin. Подключить к этому делу batchInsert в целом не сложно: https://github.com/yiisoft/yii2/issues/ ... t-97088457
Если я в batchInsert() накидаю 50 тысяч товаров, он их все за раз пошлет в базу или частями сам разобьет?
Или может мне самому стоит накидывать не больше 1000 штук?
но вам надо товары сначала отфильтровать на новые, старые с неизменившейся ценой и старые с изменившийся ценой.
Re: Как быть с "тяжелым" консольным скриптом
Это само-собой... Просто возник вопрос, на который я не нашел ответ в доке...zelenin писал(а): но вам надо товары сначала отфильтровать на новые, старые с неизменившейся ценой и старые с изменившийся ценой.
lavrik-v.ru - моя напоминалка по php.
Re: Как быть с "тяжелым" консольным скриптом
А собственно, зачем? Что плохого в том, что insert .. on duplicate key update перезапишет и неизменившиеся цены? Если по 1000 делать, это всё равно быстрые запросы будут довольно. Мне просто интересно, может я и не правzelenin писал(а):
но вам надо товары сначала отфильтровать на новые, старые с неизменившейся ценой и старые с изменившийся ценой.
Re: Как быть с "тяжелым" консольным скриптом
on duplicate key - работает по ключевому полю. А у меня поиск идет по id_товара_поставщика + name_поставщикаmkramer писал(а):А собственно, зачем? Что плохого в том, что insert .. on duplicate key update перезапишет и неизменившиеся цены? Если по 1000 делать, это всё равно быстрые запросы будут довольно. Мне просто интересно, может я и не правzelenin писал(а):
но вам надо товары сначала отфильтровать на новые, старые с неизменившейся ценой и старые с изменившийся ценой.
Сами подумайте: У меня в базе свои id, которые != id поставщика (т.к. поставщиков много)
Поэтому я храню ИХ id + ИХ name.
lavrik-v.ru - моя напоминалка по php.
Re: Как быть с "тяжелым" консольным скриптом
on duplicate key на любой ключ можно настроить, не только на primary. У меня на многих проектов, которые на unique ключах работают. В любом случае, тогда вам надо сначала считать из базы все ваши пары "id товара => ваш ключ" в массив какой-нибудь, и искать в нём, а не по базе. Поскольку дофига селектов - очень медленное. У меня, в начале моей карьеры, был подобный скрипт, который опытный коллега ускорил так, что с 6 часов время работы сократилось до 15 минут, именно таким образом
Re: Как быть с "тяжелым" консольным скриптом
я мыслю универсальными понятиями, а также не работаю с mysql, поэтому ваше "mysql по умолчанию" мне смешно и мною не рассматривается.mkramer писал(а):А собственно, зачем? Что плохого в том, что insert .. on duplicate key update перезапишет и неизменившиеся цены? Если по 1000 делать, это всё равно быстрые запросы будут довольно. Мне просто интересно, может я и не правzelenin писал(а):
но вам надо товары сначала отфильтровать на новые, старые с неизменившейся ценой и старые с изменившийся ценой.
А главное в моем комменте - идея. Реализация может отличаться.
Re: Как быть с "тяжелым" консольным скриптом
Если кому интересно, то я переделал все как вы посоветовали (через array_diff-ы и batchInsert - ы).
Раньше полная прогрузка всех прайсов занимала около 20 минут и ело 150 мб. памяти.
Теперь - 4 минуты, 4,5 мб. памяти)))
Раньше полная прогрузка всех прайсов занимала около 20 минут и ело 150 мб. памяти.
Теперь - 4 минуты, 4,5 мб. памяти)))
lavrik-v.ru - моя напоминалка по php.
- vitalik1183
- Сообщения: 1675
- Зарегистрирован: 2014.07.01, 08:42
Re: Как быть с "тяжелым" консольным скриптом
хоть на гитхаб выложи, уверен, что кто нить подскажет как оптимизировать еще быстрее
Yii2!