【问题标题】:How to upload a csv file containing large records into database in Laravel如何将包含大记录的 csv 文件上传到 Laravel 的数据库中
【发布时间】:2018-10-19 06:41:59
【问题描述】:

我正在尝试上传包含大约 10,000 条记录的 .csv 或 .xls 文件。对于第一次尝试,下面的函数/代码读取 csv 文件并能够在大约 2 分钟内将大约 1600 行/记录插入到 transactions 表中, 没有代码行:set_time_limit( 0); 我得到了:最大执行超时错误

第二次尝试,现在使用代码:set_time_limit(0);这一次,在大约 11 分钟内插入了 10,000 条记录 >

我现在的问题是:

1.如何快速读取 csv/xls 文件并将其 >= 10,000 的记录/行插入 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';
}

【问题讨论】:

  • 不知道具体是如何工作的,但这需要数据队列。
  • 你应该试着把它变成一个可排队的工作,并返回202作为请求本身的状态码

标签: laravel csv import upload xls


【解决方案1】:

在我看来,这是 Eloquent 这样的活动记录 ORM 的一大缺点。现在您正在为您保存的每条记录执行一个数据库查询,这本来就是 ​​10,000 个查询。

解决此问题的一种简单方法是使用mysqlimport,因为无论如何您都有一个 .csv 文件。不过,这主要适用于一次性上传。

另一种方法是使用模型或查询生成器的insert() 命令。已经有一个很好的答案 here 几乎可以直接回答您的问题。

【讨论】:

  • 谢谢。你的回答解决了问题。 10,000 条记录的读取和插入现在大约需要:13 秒
猜你喜欢
  • 2019-04-27
  • 2016-09-10
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 2019-09-07
相关资源
最近更新 更多