Как оптимизировать процесс импорта для очень больших данных для Laravel? - PullRequest
7 голосов
/ 05 июня 2019

У меня есть возможность импортировать очень большое количество записей около 5 миллионов.

Мне нужно одновременно делать записи для связанных таблиц в процессе импорта.

Мне нужно сделатьсвязка запросов на вставку для новых записей и выполнение всех запросов, а также создание процессов в виде кусков.

Каковы другие способы ускорения процесса?

Ответы [ 3 ]

3 голосов
/ 12 июня 2019

(скопировано с laracasts) Это, вероятно, также поможет:

DB::connection()->disableQueryLog();

"По умолчанию Laravel хранит журнал в памяти всех запросов, которые были выполнены для текущего запроса. Однако в некоторых случаяхНапример, при вставке большого количества строк это может привести к тому, что приложение будет использовать избыточную память. "

1 голос
/ 15 июня 2019

Итак, подведем итог для людей, которые не удосужились просмотреть все комментарии отдельно:

Помимо уже сделанных пунктов, вы можете рассмотреть:

  • Сначала запустите задание, которое считывает ваш входной файл xlsx / csv партиями по 50 строк (или другим разумным числом). Убедитесь, что вы не храните все строки в памяти. Затем для каждой партии строк создайте новую работу. Таким образом, у вас будет двухэтапный импорт.
  • При создании отдельных заданий для каждого пакета вы можете запускать эти задания одновременно (= несколько работников очереди одновременно).
  • Если у вас есть пользователи, ожидающие завершения импорта, убедитесь, что у вас есть индикатор выполнения или хотя бы какой-нибудь анимированный загрузчик. Хотя это не ускоряет процесс, оно даст им указание, что работа выполняется.
  • Вы также можете использовать транзакции базы данных для одновременного выполнения нескольких запросов к базе данных (кредит Philippe Thiers за этот)
0 голосов
/ 24 июня 2019

Использование:

Обработка данных в чанках Использование очередей Laravel

Использование https://docs.laravel -excel.com / 3.1 / import / Пример привязки модели пользователя

namespace App\Imports;

use App\User;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\Importable;

class UsersImport implements ToModel
{
    use Importable;

  public function model(array $row)
  {
      return new User([
       'name'     => $row[0],
       'email'    => $row[1],
       'password' => Hash::make($row[2]),
    ]);
  }
}

В контроллере

(new UsersImport)->import('users.xlsx', 'local', \Maatwebsite\Excel\Excel::XLSX);
...