Перайсці да асноўнага змесціва

Прадукцыйнасць на вялікіх наборах даных

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 унікальнасці большым за чаканы час генерацыі.

Вымярайце ўвесь шлях

Асобна вымярайце час базы даных, стварэння мадэляў, пераўтварэння, серыялізацыі і публікацыі ў сховішча. Аддалены дыск можа стаць асноўным выдаткам нават пры хуткай генерацыі.

Глядзіце таксама