Перейти к основному содержимому

Производительность на больших наборах данных

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 уникальности больше ожидаемого времени генерации.

Измеряйте весь путь

Отдельно измеряйте базу данных, создание моделей, преобразование, сериализацию и публикацию. Удалённый диск может стать основной затратой даже при быстрой генерации.

Смотрите также