【问题标题】:How to import csv file to mysql more faster codeigniter如何更快地将csv文件导入mysql
【发布时间】:2013-10-15 08:20:50
【问题描述】:

它可以工作,但是当我在 CSV 文件中导入近 2500 多行的大文件时,它会缓慢加载/导入,并且说错误,但有些文件正在插入,有些则没有。我的问题是有没有办法让它更快导入?我在文件中看到但我不知道如何使用它。

代码:

    function convert_csv($id){
                if (empty($id)) redirect("contracts");
                $config['upload_path']   = './files/contracts-csv/'; 
                $config['allowed_types'] = 'csv';   
                $config['max_size']      = '4096';      
                $config['overwrite']     =  TRUE;

                $this->load->library('upload', $config);
                $this->upload->display_errors('', '');

                if (!$this->upload->do_upload("csv_file")) {
                      echo $this->upload->display_errors(); die();
                      $this->data['error'] = array('error' => $this->upload->display_errors());
                } else {
                    $upload_result = $this->upload->data();
                    $upload_result = $this->upload->data(); 
                    $this->load->library('csvreader');
                    $result =   $this->csvreader->parse_file("./files/contracts-csv/".$upload_result['file_name']);
                    $date_today = date('Y-m-d H:i:s');
                        foreach ($result as $v) {
                            $this->contract_items->add_serial($v,$id,$date_today);
                        }
                }
}

【问题讨论】:

  • 您是否尝试在脚本开头添加set_time_limit(0)?它不会更快,但它会完全执行。
  • 我需要在哪里添加?在我的 if(empty...) 之前?
  • 它的运行方式相同......

标签: php file codeigniter csv import


【解决方案1】:

使用MySQL transactions in CodeIgniter,它将大大加快一切速度(例如,将 500 个项目组成块并将它们插入到一个事务中)。

但如果它以错误结束,那么问题可能出在其他地方。 2500 不算多。

【讨论】:

  • 不是什么错误,我认为它是因为加载速度太慢,可能插入了 2600 个文件,但文件总数为 2800,当 2600+ 时,它显示错误“此网页不可用”
  • 好的,所以尝试使用事务,我相信它对处理速度有很大帮助。
  • 这是正确的吗? $this->db->trans_start(); $this->db->set('contract_id', $id); $this->db->set('date_inserted', $today); $this->db->insert($this->table, $data,$id,$today); $this->db->trans_complete();
【解决方案2】:

csv 中 line 的每次迭代都会执行以下操作:

  • 构建插入 sql
  • 发送到数据库布局
  • 得到响应

您可以尝试像这样构建批量 sql:

insert into table_name (f1, f2, f3) values ("val1", "val2", "val3"), ("val2_1", "val2_2", "val2_3"),...

大约 100-200 '("val1", "val2", "val3")' 块应该更快,但我不知道 codeigniter 缓存和其他东西怎么样......

【讨论】:

    【解决方案3】:

    您可以将其封装在 insert_batch 查询中。

    $your_data = array();
    foreach ($result as $v) {
        $your_data[] = array(
            'v' => $v,
            'id' => $id,
            'date_today' => $today,
        );
    );
    
    $this->db->insert_batch('your_table_name', $your_data);
    

    这会将整个事情作为单个查询运行。这应该比多个查询更快。确切的代码取决于您,我不知道 $this->contract_items->add_serial 是否知道。

    【讨论】:

    • 我已经尝试过了,但是我在 csv 文件中有两列没有在其中指明。
    • 这与您在@Martin 的答案的评论中粘贴的代码 sn-p 不同。你能用你的代码的更多细节更新你的帖子,而不是我们试图摸索稻草吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2012-06-20
    • 1970-01-01
    相关资源
    最近更新 更多