Laravel-Excel 2, вставка данных быстрее - PullRequest
0 голосов
/ 14 мая 2018

Это основной код метода, который я использую для импорта файла Excel (используя Maatwebsite Laravel-Excel 2) в мою базу данных:

$data = Excel::selectSheetsByIndex(0)->load($file, function($reader) {})->get()->toArray();
DB::beginTransaction();
try {
    foreach ($data as $key => $value) {
        $med= trim($value["med"]);
        $serial = trim($value["nro.seriemedidor"]);

        DB::table('medidores')->insert([
            "med" => $med,
            "serial_number" => $serial
        ]);
    }
    DB::commit();
} catch (\Exception $e) {
    DB::rollback();
    return redirect()->route('myroute')->withErrors("Some error message");
}

Это прекрасно работает, когда у меня «мало» данных(скажем, менее 5000 строк в файле Excel).Но мне нужно работать с большим файлом Excel, который содержит 1,4 миллиона строк, разделенных на более чем 1 лист.Как я мог сделать свой метод быстрее?Любой совет?

РЕДАКТИРОВАТЬ: я буду редактировать вопрос с кодом, который был по ссылке одного из комментариев ответа:

$data = Excel::selectSheetsByIndex(0)->load($file, function($reader) {})->get()->toArray();
DB::beginTransaction();
try {
  $bulk_data = [];
  foreach ($data as $key => $value) {
    $med= trim($value["med"]);
    $serial = trim($value["nro.seriemedidor"]);
    $bulk_data[] = ["med" => $med,"serial_number" => $serial] ;
  }
  $collection = collect($bulk_data);   //turn data into collection
  $chunks = $collection->chunk(100); //split into chunk of 100's
  $chunks->toArray(); //convert chunk to array
 //loop through chunks:
 foreach($chunks as $chunk)
 {
   DB::table('medidores')->insert($chunk->toArray());
 }
  DB::commit();
} catch (\Exception $e) {
  DB::rollback();
  return redirect()->route('myroute')->withErrors("Some error message");
}

Чак был то, что работало для меня.

1 Ответ

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

Да, вы можете вместо выполнения X (количество запросов к базе данных) * N (количество листов) попробовать выполнить простую массовую вставку, которая обойдется вам только в сложности циклического перемещения по данным, сохраняющим запросы к базе данных X * N, вот пример:

$data = Excel::selectSheetsByIndex(0)->load($file, function($reader) {})->get()->toArray();
DB::beginTransaction();
try {
  $bulk_data = [];
  foreach ($data as $key => $value) {
     $med= trim($value["med"]);
     $serial = trim($value["nro.seriemedidor"]);
     $bulk_data[] = ["med" => $med,"serial_number" => $serial] ;
  }
  DB::table('medidores')->insert($bulk_data);
  DB::commit();
} catch (\Exception $e) {
  DB::rollback();
  return redirect()->route('myroute')->withErrors("Some error message");
}

Вы можете обратиться к этому ответу для получения дополнительной информации о запросах БД: https://stackoverflow.com/a/1793209/8008456

...