Перейти до основного вмісту

Швидкодія на великих наборах даних

Laravel Feeds призначений для поступового запису даних. Використання пам'яті залишається обмеженим, лише коли застосунок зберігає кожен попередній крок ледачим.

Зберігайте запит ледачим

Повертайте побудовник Eloquent Builder безпосередньо:

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() лише для навмисного обмеження кількості записів.

Передавайте тривалі фіди до черги

Режим черги виносить генерування з консольного запиту, але не зменшує обсяг пам'яті, який використовує фід. Використовуйте асинхронне підключення, запускайте обробники з належними обмеженнями часу та пам'яті й задавайте час дії блокування унікальності довшим за очікуваний час генерування.

Вимірюйте весь шлях

Окремо вимірюйте час роботи бази даних, створення моделей, перетворення, серіалізації та публікації у сховищі. Для віддалених дисків публікація може стати основною витратою, навіть коли саме генерування швидке.

Дивіться також