Прадукцыйнасць на вялікіх наборах даных
Laravel Feeds запісвае даныя паступова. Памяць застаецца абмежаванай толькі тады, калі кожны папярэдні крок праграмы застаецца лянівым.
Пакідайце запыт лянівым
Вяртайце Builder Eloquent непасрэдна:
public function builder(): Builder
{
return Product::query()
->select(['id', 'title', 'updated_at'])
->where('is_exportable', true);
}
Не матэрыялізуйце ўвесь вынік перад генерацыяй. Выбірайце толькі патрэбныя слупкі і загадзя загружайце толькі сувязі, якія выкарыстоўвае item(), каб пазбегнуць запытаў N+1.
Наладжвайце памер блока
Стандартнае значэнне — 1000 запісаў. Меншыя значэнні зніжаюць максімальны расход памяці мадэлямі і павялічваюць колькасць запытаў. Большыя значэнні памяншаюць накладныя выдаткі запытаў і павялічваюць расход памяці. Вымярайце з памерамі радкоў, блізкімі да вытворчых.
public function chunkSize(): int
{
return 500;
}
Падзяляйце выходныя файлы
Выкарыстоўвайце perFile(), калі спажывец прымае некалькі файлаў або адзін вывад становіцца складана публікаваць і паўтараць.
public function perFile(): int
{
return 50000;
}
Пакідайце для maxFiles() стандартнае значэнне 0, калі трэба экспартаваць усе прыдатныя запісы. Калі perFile() і maxFiles() большыя за нуль, Laravel Feeds экспартуе не больш за іх здабытак і паспяхова завяршае працу, не паведамляючы, што наступныя запісы былі прапушчаныя. Задавайце maxFiles() толькі тады, калі такое абмежаванне колькасці запісаў наўмыснае.
Адпраўляйце доўгія стужкі ў чаргу
Рэжым чаргі выносіць генерацыю з кансольнай каманды, але не памяншае памяць, патрэбную стужцы. Выкарыстоўвайце асінхроннае падключэнне, запускайце апрацоўшчыкі з адпаведнымі абмежаваннямі часу і памяці і задавайце TTL унікальнасці большым за чаканы час генерацыі.
Вымярайце ўвесь шлях
Асобна вымярайце час базы даных, стварэння мадэляў, пераўтварэння, серыялізацыі і публікацыі ў сховішча. Аддалены дыск можа стаць асноўным выдаткам нават пры хуткай генерацыі.