Такое себе BIGDATA на Opencart

Небольшой кейс как проводились исследования выгрузки на маркетплейс большого количества товаров (около 120 000 в базе)

ноябрь 07 , 2018

Ко мне на днях обратился владалец магазина на +/- 120 000 товаров. Ему надо было решить проблему выгрузки товаров для маркетплейса rozetka.ua. Но была проблема.

При запуске выгрузки сайт падал и не работал до перезагрузки сервера. 

Для начала решено было посмотреть в чем проблема. Первое на что надо смотреть это какой код выборки из базы. Написан для этого кастомный оптимизированный запрос в базу, не используются стандартные методы - это уже хорошо, но проблему не решает.

Было принято решение замерить скорость работы запроса. Сначала для 60 000 товаров. Все в пределах, пары секунд. Далее надо бы память померять. Здесь то и проявилась причина проблем - нехватка оперативной памяти на сервере. Для 60 000 товаров как раз в притык, но у нас 120к.

После этого решил выключить выборку самого весомого поля - description, вот здесь потребление памяти в два раза и стало меньше.

В такой ситуации надо как-то по кускам собирать файл выгрузки xml но он получится громадного объема т.к. только описания весят 690МБ (для теста записал описания в файл)

В процессе была выведена такая статистика:

 Без выборки product_description

Память до запроса: 59.934913635254
Память после запроса: 405.99559020996
Количество товара: 60000
Время выполнения скрипта: 1.1127 сек.
Память: 347.47534942627 MB

Выборка из product_description (name)

Память до запроса: 59.938293457031
Память после запроса: 418.81477355957
Количество товара: 60000
Время выполнения скрипта: 1.8027 сек.
Память: 360.29453277588 MB

Выборка из product_description (name, description)

Память до запроса: 59.97900390625
Память после запроса: 759.912940979
Количество товара: 60000
Время выполнения скрипта: 4.557 сек.
Память: 701.39270019531 MB

Выборка всего, кроме description

Память до запроса: 59.938209533691
Память после запроса: 749.97188568115
Количество товара: 115497
Время выполнения скрипта: 7.0611 сек.
Память: 691.45182037354 MB

Полная выборка с записью в файл описаний (на каждый товар идет свой запрос на выборку отдельно description)

Память до запроса: 59.941947937012
Память после запроса: 749.97454071045
Количество товара: 115497
Время выполнения скрипта: 3.8669 сек.
Память: 691.45067596436 MB

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

UPD: Заказчик подтвердил работы по выгрузке. Кейс по тому как это было сделано в статье: выгрузка большого количества товара на маркетплейс rozetka.ua
Расскажи друзьям!