Импортируйте большой CSV-файл с laravel excel и postgresql - PullRequest
0 голосов
/ 27 апреля 2020

Привет У меня есть большой CSV-файл с 130 000 строк

Я использую laravel Excel 3.1 и Lavaravel 5.8

Класс импорта:

<?php

namespace App\Imports;

use App\UsoSuelo;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\WithChunkReading;
use Maatwebsite\Excel\Concerns\WithBatchInserts;

class UsoSueloImport implements ToModel, WithHeadingRow, WithChunkReading, WithBatchInserts
{
    /**
    * @param array $row
    *
    * @return \Illuminate\Database\Eloquent\Model|null
    */
    public function model(array $row)
    {
        return new UsoSuelo([
            'cod_pais'     => $row['cod_pais'],
            'cod_fundo'     => $row['cod_fundo'],
            'nom_fundo'     => $row['nom_fundo'],

        ]);
    }
    public function batchSize(): int
    {
        return 1000;
    }
    public function chunkSize(): int
    {
        return 1000;
    }
}

И я использую класс характеристик из моего контроллера:

    trait storeTrait{

    public function storeUsoSuelo($archivo) {
        Excel::import(new UsoSueloImport,$archivo); 
    }
    public function storeFundo($archivo) {
        Excel::import(new FundosImport,$archivo); 
    }
    public function storeFundoGrilla($archivo) {
        Excel::import(new FundosGrillasImport,$archivo); 
    }
    public function storeCuadrante($archivo) {
        Excel::import(new CuadrantesImport,$archivo); 
    }
}

Это мой ImportController

class ImportController extends Controller
{
    use storeTrait  {
        storeUsoSuelo as storeUsoSuelos;
        storeFundo as storeFundos;
        storeFundoGrilla as storeFundoGrillas;
        storeCuadrante as storeCuadrantes;

    }
    public function store(Request $request)
    {
        $usoSuelo = 'uso_suelo.csv';
        $this->storeUsoSuelos($usoSuelo);

        $cuadrante = 'cuadrantes.csv';
        $this->storeCuadrantes($cuadrante);

        $fundo = 'mv_qav_fundos.csv';
        $this->storeFundos($fundo);

        $fundoGrilla = 'fundos_grilla.csv';
        $this->storeFundoGrillas($fundoGrilla);
}
}

Я провел тесты, и мой код работает с CSV менее 100 строк, но когда я пытаюсь с 130 000 строк это занимает слишком много времени, и я получаю следующую ошибку:

"Maximum execution time of 60 seconds exceeded"

И через 1 минуту в базу данных было вставлено только 4000 строк (postgresql)

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Вы пробовали этот пакет league/csv из Лига выдающихся пакетов .

Если вам нужна только поддержка CSV, а не xlsx или других типов Excel. Из того, что я прочитал, этот пакет может дать вам лучшую производительность, этот комментарий от одного из членов команды Maatwebsite (пакет, который вы используете в настоящее время) также подтверждает это.

Надеюсь, это поможет .

0 голосов
/ 28 апреля 2020

Я поместил эти 2 строки в моем контроллере в начале скрипта:

ini_set ('max_execution_time', 3600);
ini_set ('memory_limit', '2048M');

После этого я решил, что я также изменил чанк с 1000 на 5000, но это все еще занимает слишком много времени. По крайней мере, 5 минут

Я надеюсь, что кто-то может помочь мне улучшить время

...