Как загрузить CSV-файл с большими записями в базу данных в Laravel - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь загрузить файл .csv или .xls, содержащий около 10000 записей. Для первой попытки приведенная ниже функция / код читает файл csv и может вставить около 1600 строк / записей в таблицу транзакций за ~ 2 минуты, без строки кода: set_time_limit (0 ); И я получил: Максимальное время ожидания выполнения Ошибка

Со второй попытки, теперь с кодом: set_time_limit (0); На этот раз 10000 записей были вставлены через ~ 11 минут .

Мои вопросы сейчас:

1.Как я могу прочитать файл csv / xls и вставить его записи / строки размером> = 10000 в базу данных в приложении Laravel, очень быстро?

2. Практика, 'set_time_limit (0)' , которую я использовал здесь, это хорошо? Есть ли лучший способ, которым я могу пойти по этому поводу?

3.Перед чтением и вставкой, могу ли я определить время / максимальное время, необходимое для завершения операции / выполнения?

public function importDataSet(Request $request)
{

    if(Input::hasFile('file')){
        $file = Input::file('file');
        $uname = uniqid();
        $oname = $file->getClientOriginalName();
        $filename = $uname.$oname;
        //create a folder, data-sets, if not exist in the public folder
        $filelocation = 'data-sets';
        $filepath=$file->move($filelocation, $filename);

        ini_set('auto_detect_line_endings', TRUE);

        $header = '';
        $rows = array_map('str_getcsv', file($filepath));
        $header = array_shift($rows);
        $csv = array();
        set_time_limit(0);//reset maximum execution time to infinity for this function
        foreach ($rows as $row) {
            $csv[] =  $row;//Is not used
            //eturn $rows;
            $transaction = new Transaction;
            $transaction->dataset_id = 1;
            $transaction->itemsets=json_encode($row);
            $transaction->save();
        }
    }else{
        //noting here
    }
    return 'Success';
}

1 Ответ

0 голосов
/ 09 мая 2018

Это, на мой взгляд, один из больших недостатков ORM с активной записью, такого как Eloquent. Теперь вы выполняете запрос к базе данных для каждой сохраняемой записи, которая по своей сути составляет 10 000 запросов.

Один простой способ решить эту проблему - использовать mysqlimport, так как у вас все равно есть файл .csv. Это в основном относится к разовым загрузкам.

Другой способ - использовать insert() команды вашей модели или построителя запросов. Здесь уже есть отличный ответ здесь , который в значительной степени прямо отвечает на ваш вопрос.

...