Такое себе BIGDATA на Opencart
Небольшой кейс как проводились исследования выгрузки на маркетплейс большого количества товаров (около 120 000 в базе)
Ко мне на днях обратился владалец магазина на +/- 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