Laravel большой импорт CSV с использованием maatwebsite Excel

#laravel #laravel-7

#laravel #laravel-7

Вопрос:

У меня есть файл CSV с 30 тыс. строк. Я использовал maatwebsite Excel для импорта CSV в мою базу данных pgsql.

Проблема в том, что каждый раз, когда он загружает данные 10-12 КБ в базу данных, страница выдает ОШИБКУ HTTP 500

Ошибка :

 This page isn’t working
localhost is currently unable to handle this request.
HTTP ERROR 500
  

У меня есть изменения ниже переменной в php.ini

 max_execution_time=0
max_input_time=3000
post_max_size=128M
  

Я попробовал приведенный ниже код в ReportsImport

 class UserReport implements ToModel, WithCustomCsvSettings,WithChunkReading,WithHeadingRow
{
    public function model(array $row)
    {
          // dd($row);
          return new UserReport([
              'user'     => $row['username],
              'amount'   => $row['amount']
          ]);
    }
    
    public function getCsvSettings(): array
    {
         return [
              'input_encoding' => 'UTF-8'
         ];
    }
    
    public function chunkSize(): int
    {
        return 1000;
    }
}
  

Как я могу решить эту проблему HTTP 500 error ?

Журнал ошибок : local.ERROR: Allowed memory size of 536870912 bytes exhausted

Версия: Laravel Framework 7.26.1

Комментарии:

1. Что в журнале ошибок?

2. @Thomas local. ОШИБКА: Разрешенный объем памяти 536870912 байт исчерпан

3. Вы добавили implements WithChunkReading ? Что произойдет, если вы уменьшите размер ячейки?

4. попробуйте использовать задания для решения этой задачи

5. Вы пытались уменьшить размер блока? Если это не поможет, я бы попробовал добавить пакетные вставки следующим (в дополнение к существующему чтению фрагмента).

Ответ №1:

Проблема в том, что приложение пытается сохранить слишком много данных в памяти. Я вижу, что вы уже используете чтение фрагментов, но этого, похоже, недостаточно

Чтобы уменьшить потребление памяти при чтении табличных данных, попробуйте уменьшить размер вашего блока.

Чтобы уменьшить потребление памяти моделями, попробуйте добавить пакетные вставки в дополнение к чтению фрагментов.