Кому попадалась или может у кого есть в свободном доступе годная выгрузка csv для импорта каталога под Битрикс?
Требуется написать импорт для каталога с товарами и торговыми предложениями. В основном текстовые простые свойства. Нужна очень высокая скорость, чтобы 20 000 товаров за один шаг на кроне обновлять на сервере минут за 20. Пробовал импорт битрикса csv из коробки. Работает только для 5 000 товаров нормально, но торговые предложения нефига не работают. Перезатираются. Был ли у кого опыт написания подобного импорта и может есть какие то наработки или пожелания, советы как написать качественно. Сайт уже работает в проде. Не хочу базу затереть случайно.
Хочу написать 3 импорта, на создание/обновление товаров, торговых предложений, цен товаров. И чтобы это можно было вешать на крон, ну и посетители могли зайти. Сейчас со стандартным импортом работает по похожей логике.
P.S. Огромная просьба - не оскорбляете битрикс и не предлагайте свои любимые фреимворки, а предложите если есть свои идеи и примерную последовательность в написании скрипта.
Посмотрите что-то может есть на гитхабе, для торговых предложений лучше перейти на XML импорт.
Торговые предложения загрузить csv можно только если есть связь по XML_ID или другому уникальному параметру.
Берясь за написания импорта я обычно стараюсь думать не о том как побыстрее обновить побольше товаров, а о том, как побольше товаров не обновлять.
Первая и самая простая оптимизация добавить к свойствам товаров еще одно - HASH и писать туда md5 от сереилазованного массива которым вы хотите обновить товар. Дальше, при следующем обновлении вы перед Update будете вычислять от сериалазованного массива которым хотите обновить товар, этот Hash и обновлять товар только если он не совпадает с сохраненным хэшем и записывать этот новый хэш.
Такая схема очень удобна в случае если источник не умеет отдавать только изменившиеся товары или товар состоит из нескольких элементов ИБ (Товар+Торговое предложени+Элемент свойств). Кроме того помним что цена тоже хранится отдельной сущностью и для нее можно провернуть тот же трюк. Вычислить md5 прямо сильно быстрее чем сделать запись.
Кроме того следите за тем чтобы вашем кастомном импорте не было ничего кроме записи в update внутри цикла. А то всякое видеть приходилось.
Вообще записать 1000 товаров за минуту в базу, без картинок - это полная ерунда. Должно хватить любой производительности, если конечно не выяснится что у вас не 100 ТП к каждому товару.
И да - убедитесь, что и товары и ТП и все ИБ в которые вы пишите во время импорта хранят свойства в отдельных таблицах, а не в общей.
Спасибо. У меня 20 000 товаров с картинками. И столько же ТП. Примерно какой максимум времени у этой выгрузки должен быть? Свой сервак. Оперативы 2 гига. SSD, ресурсы есть. Если по шагам делать через выгрузку из коробки - вроде за час-полтора отрабатывала - но долго. Хочу уложиться в 30 мин. Реально? Ну и чтобы пользователи могли покупать в это время.
Примерно какой максимум времени у этой выгрузки должен быть?
Да это невозмжно сказать. Вот буквально вчера два сервака отличающиеся вроде только количеством ядер (на одном 8 на другом 4), переносил базы между ними - тот что с 4 ядрами работает в РАЗЫ быстрее, причем это посещаемый сервак, а восьмиядерник - тест. А всему виной сильно разные SSD.
У меня 20 000 товаров с картинками. И столько же ТП.
С картинками - совсем другой вопрос. Например если у вас там создается превью из детальной, да еще обе уменьшаются, да еще накладывается водяной знак... то возможно у вас сервер на самом деле только картинками и занят.
Хочу уложиться в 30 мин. Реально?
Зависит от многих факторов. У меня раз был случай когда удалось оптимизировать двухчасовой импорт (может и больше - я через два часа его тупо прервал, не дожидаясь конца) до 17 секунд. Но это понятно единичный случай - очень грубые косяки он содержал.
Вот взять трюк с HASH - он может очень сильно ускорить импорт если меняются очень мало товаров из этих 20000, а если каждая выгрузка содержит все измененные товары, то он его только замедлит.
Опять же - прямо сейчас работаю с импортом - 9000 объектов, и каждый содержит от 20 до 150 фотографий. Причем каждое фото хранится как отдельный элемент ИБ (потому что к нему хранится куча разной другое инфы) - помогло очень сильно, так как источник выгружает все 9000, но реально изменяются в каждой выгрузке только 5-10 объектов. Раньше импорт занимал всю ночь. Теперь спокойно делаем его каждый час.