Экспорт большого объёма данных. Express советы
Сегодня мы с вами поговорим про генераторы. Классическая проблема, классическая боль для большинства новичков. У нас есть итерация по огромному количеству элементов, плюс с каждым мы производим определенные действия и в итоге уходим в лимит памяти. Давайте посмотрим что с этим можно сделать.
🎁 Для вас есть подарок, забирайте - cutcode.dev/l/4pxn 🎁
#Expressсоветы#laravel#cutcode
---------------------------------------------------------------------------------
🚀📹👨🏫 Как насчет прокачки своих навыков с помощью наших обучающих видеокурсов по web-разработке? Переходи на мой сайт 👇
learn.cutcode.dev/?
❗️❗️❗️Присоединяйся к нашему комьюнити в телеграм - там и советом помогут и много интересного - cutcode.dev/l/icwf
---------------------------------------------------------------------------------
📹 делитесь этим видео с друзьями:
• Экспорт большого объём...
🔔 подпишитесь на KZread-канал: kzread.info?s...
📼 Курс по Laravel с нуля:
• Курс по Laravel 8 обуч...
Экспорт большого объёма данных. Express советы
---------------------------------------------------------------------------------
🔗 наш сайт: cutcode.dev/?
📱 Наш telegram-канал: t.me/laravel_cutcode
Пікірлер: 51
Рубрика нужна! Лайк!
Однозначно, нужна такая рубрика!
@CutCodeRu
26 күн бұрын
Принято
Рубрика нужна ❤
Быть. Да. Можно даже в плейлист какой-то выделить такое ролики.
Рубрика класс, давай больше))
Интересно, делай еще!
Конечно нужна такая рубрика!
Нужна, очень нужна)
Рублрика нужна, Лайк ставлю)) подписку и колокольчик :D
Однозначно, быть!!!
@CutCodeRu
26 күн бұрын
Принял)
Отличный совет, полезный, спасибо. Смотрю все ваши видео, любой длины 😊
@CutCodeRu
25 күн бұрын
А я все ваши комментарии! Спасибо!
однозначно полезная рубрика
Ждем еще!)
На мой взгляд нужно углублять в детали реализации, чтобы понимать, что ларавель делает под капотом метода cursor
@CutCodeRu
3 күн бұрын
На канале уже есть ролик
Нужна, очень нужна
как всегда лайк 👍
однозначно да
в некоторых случаях вот действительно не хватает наглядного примера решения, вроде и все понятно что пишут как решается но делаешь как пишут не всегда работает из за особенностей компонентов и версий 😂
По архитектуре интересно бы были задачки и решения. Как из лапшекода делать чистый
@CutCodeRu
26 күн бұрын
Присылайте лапшекод в чат или в личку
Количество использованной памяти уменьшили, но мы так сильно увеличили нагрузку на БД. На каждую запись по 1 запросу - это более 70000 запросов. В некоторых фреймворках есть решение из коробки (Yii2 методы each(), batch() для query билдера). Например: foreach ($queryModels->each(1000) as $model), где 1000 - это количество моделей в одном запросе. Так мы не сильно загружаем БД, и остаёмся в рамках лимита памяти
@CutCodeRu
25 күн бұрын
запрос то один, мы кроме получения ничего не делаем, а так то что вы пишете в eloquent это метод chunk (лимит офсет)
круто
нужна, давайте теперь Импорт
@CutCodeRu
26 күн бұрын
😄
Вот именно из таких частных случаев и строттся опыт;] когда кипишь над задачей день-другой, и потом осенило.. Рубрика "я понял/всё просто/хозяйке на заметку..." даст буст в просмотрах. Другой момент идеологический - ..я кодил, а кто-то получил скил даром.
продолжай
@CutCodeRu
26 күн бұрын
Хорошо)
Нужна
Дай название рубрике в стиле gist :)
Если курсор из базы берет по одной записи, то это не эффективно. Лучше использовать ларавелевский batch. Причем стоит посчитать количество памяти на пачку, чтобы брать по максимому, так будет меньше запросов в базу. Если нужно сортировать или аггрегации по всей таблице делать, то это точно быстрее будет. Ещё есть такая фишка, что при softDelete можно добавить индекс с сортировкой по id (или другому молю, по которому сортируется) и в индексе задать условие deleted_at is null или наоборот, если записи удаляются редко, так инварианты отбрасываются + всё заранее отсортировано и уже не всю таблицу приходится сканить. А я пока почитаю про то как работает курсор.
@vesh95
23 күн бұрын
Вообще если с большими таблицами приходится работать, то лучше знать сложности алгоритмов, чтобы понимать что вообще может дать explain и как мы пожем что-то поменять, чтобы стало быстрее.
@CutCodeRu
23 күн бұрын
Метод курсора будет выполнять только один запрос в базе данных; однако отдельные модели Eloquent не будут гидратированы до тех пор, пока они не будут фактически итерированы. Таким образом, только одна модель Eloquent хранится в памяти в любой момент времени во время итерации по курсору. В какой то мере генератор был и не нужен но и решение с chunk тоже имеет место быть
@vesh95
23 күн бұрын
@@CutCodeRu Ну бывают выборки из базы, что и сырой результат базы не помещается. Но есть у меня местечко, где стоит попробовать покурсировать. Если получится и по памяти пройдет, ибо одним запросом всё делается в секунды, а чанками на минуты выходит. Идея хорошая, надо попробовать. Перепутал, да, чанк.
@CutCodeRu
23 күн бұрын
@@vesh95 напишите потом про опыт с курсором
@vesh95
18 күн бұрын
@@CutCodeRu Попробовал. Было через чанки по 500 сделано, процесс длился 1000 сек на 1.5млн записей (если не ошибся с кол-вом), на той же выборке без чанков с курсором стало 250-100, колебалось от запуска к запуску, но разница четко прочувствовалась. По сути из O(table_iter_time*chuncs_count) в О(table_iter_time) сложность перешла. Однако где использовались связи там это почти не эффективно, только на релейшены больше запросов появляется. Так что на простые выгрузки по одной таблице самое то, а вот с релейшенами посложнее выходит
А если применить LazyCollections? Тоже под капотом генератор
@CutCodeRu
25 күн бұрын
kzread.info/dash/bejne/qJ911bCflq3Firw.htmlsi=U8axkklZQdTTWeO4
лимит офсет, решают проблему. Генератор не нужен, курсов в принцепе тоже. если только бд на лярд строк
А я делал очереди для этого
@CutCodeRu
26 күн бұрын
И правильно делали но это о другом
@lbbMHz
26 күн бұрын
а очереди тут причём?
ogon
~71к запросов в базу?
@CutCodeRu
26 күн бұрын
Записей