Серкрипт на 500 строк отрабатывает за 10 часов!!!

D
На сайте с 28.06.2008
Offline
984
560

Есть скрипт который должен сформировать базу Джумлы, по сути обновляет таблицу контент + зависимости в таблицах assets и associations. Данные для обновления скрипт берет из соседней базы.

Так вот, все это запущено в ssd впс с 4 ядрами и 16 Г оперативки. И заканчивает работу скрипт за 10 часов !!!. (за это время он добалвяет примерно 20.000 записей)

Его работу мне нужно будет повторить еще 10 раз я не могу понять ПОЧЕМУ БЛИН ТАК ДОЛГО???

Думал медленные запросы, включил логирование.... ну да, был один запрос. Так как запросы АПТДЕЙТ, то удалил индексы с таблицы assets и запросы пропали, но все равно - в секунду добавляется 1 запись а то и меньше!!

Посмотрите плиз код в приложенном файле - что там может так тупить?

edogs software
На сайте с 15.12.2005
Offline
719
#1

Dram,

Так-то у Вас определенно чертовски много запросов.

Не, понятно что все красиво, через АПИ и отдельные функции.

Но по факту Вы на каждый чих совершаете туеву хучу операций.

Вы даже 191 категорию и то не за один раз выбираете все, а на каждую отдельный запрос делаете.

Что уж говорить о тэгах, альясах, связях и т.д., по каждой отдельной у Вас проверка, создание, апдейт, запись.

Когда можно было бы выбирать "чохом" группу данных, а не по одиночке дергать.

По любому уменьшение количества запросов поможет.

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

В остальном посоветовать что-то тяжело, Вам надо просто подебажить немного. Если нет возможности подключить внешний дебаггер который покажет где именно максимум времени выполнения (в каких функциях, с учетом количества раз вызова), понатычьте вместо этих pring pre кучу echo microtime и смотрите где уходит максимум времени - там и ищите проблему.

Но в любом случае, количество запросов надо уменьшать.

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

p.s.: если у вас вдс, почему Вы коннектитесь через ИП:порт? Коннектитесь через сокеты, это быстрее, а при большом количестве запросов намного быстрее.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход.
MK
На сайте с 18.08.2005
Offline
126
#2
Dram:
Есть скрипт .... ну да, был один запрос ... но все равно - в секунду добавляется 1 запись а то и меньше!!

В скрипте на первый взгляд 🍻 не видать того, что на 10 часов

Вы даже 191 категорию и то не за один раз выбираете все, а на каждую отдельный запрос делаете.

А почему, кстати, 191 ( public function importProducts(){ for($g = 1; $g < 191; $g++){ ), а если их 291 или 2?

Вот тут намекают что можно как то так:


$a = array(
1=>array(':id'=>1),
2=>array(':id'=>2),
....
291=>array(':id'=>291),
)
$db->t('select `rowid`, `catid`, `name` from `cats` where `id` = :id ;', $a)->rows();

Дело только за тем, чтобы функция t($sql, $array) класса который скрывается за $db (вероятно надстройка над pdo или extends pdo) используя PDO->prepare ( string $statement [, array $driver_options = array() ] ) и еще несколько методов быстро вставила массив в базу данных. На sqlite, офигенный выигрыш, на mysql - "зависит".

В мануале нет прямой реализации, t() только лишь фантазия, которая успешно работает лет 5 наверное. Пиарю подготовленные запросы и прямую выгоду о этого

UP/ Выигрыш и "зависит" однозначно в плюс для запросов UPDATE, для других тоже неплохо.

нет

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий