如何提高CSV上传的执行速度


How to make a CSV upload perform faster?

我想知道你们中是否有人尝试过以实时形式(multipart/form-data)进行CSV迁移,我的是工作的,我唯一讨厌的是它消耗了太多的时间,并且达到了最大的执行超时。我所做的快速修复是通过在我的php.ini(或set_time_limit())中设置最大执行时间,但它真的很烦人,等待半个小时只是为了导入整个数据,虽然它不超过100kb。是我反应过度还是怎么的?

这是代码:

function upload($id, $old_eid)
{
    $filename = $_FILES['event_file']['tmp_name'];
    $handle = fopen($filename, "r");
    while(($data = fgetcsv($handle, 1000, ",")) !== FALSE){
        $id  = $id;
        $id2 = $data[2];
        $ckr = $this->Manager_model->check_if_record_exists($id, $id2);
        if(count($ckr) > 0):
            $this->session->set_flashdata('err', '<div class="error">Duplicated record</div>');
            redirect("manager/csver/$id");
        else:
            $data['col1'] = $data[0];
            $data['col2']  = $id;
            $data['col3'] = $data[3].' '.$data[4];
            $data['col4']  = $data[2];
            $data['col5'] = $data[6];
            $data['col6']  = $data[1];
            $data['col7']  = $data[7];
            $data['col8']  = mt_rand(11111, 99999);
            $data['col9']   = $old_eid;
            $this->Manager_model->add_csv($data);
            $this->Manager_model->add_csv_to_photo($data);
        endif;
    }
        fclose($handle);
        $this->session->set_flashdata('success', '<div class="success">CSV successfully uploaded</div>');
        redirect("manager/records/$id");
        //$this->session->set_flashdata('msg', '<div class="success">Records successfully uploaded</div>');
} 
我Manager_model

:

 function add_csv($data)
{
    $src = array(
            'col1'=> $data['col1'],
            'col2'    => $data['col2'],
        'col3' => $data['col3'],
        'col4'  => $data['col4'],
        'col5' => $data['col5'],
        'col6'  => $data['col6'],
        'col7' => $data['col7'],
        'col8' => $data['col8'],
    );
    $this->db->insert('e_records2', $src);
    if($this->db->affected_rows() == '1'):
        return TRUE;
    endif;
    return FALSE;
}
function add_csv_to_photo($data) {
    $src = array(
            'col1'=> $data['col1'],
               'col2' => $data['col2'],
                'col3' => $data['col3'],
                'col4' => $data['col4'],
                'col5'=> $data['col5'],
                'col6'=> $data['col6'],
    );
    $this->db->insert('e_records', $src);
    if($this->db->affected_rows() == '1'):
        return TRUE;
    endif;
    return FALSE;
} function check_if_record_exists($id, $id2) 
{
    $eid = $id;
    $id2 = $id2;
    $query = $this->db->query("select * from races_results where eid = $eid AND id2 = $id2");
    return $query->result();
}

注:我这里讲的不是PhpMyAdmin因为我知道如何导入csv文件。此外,它还会创建许多琐碎的任务来使用骨骼来迁移文件。

为什么不运行分析器来优化代码呢?Codeigniter包含这个有用的部分来解决类似这样的问题http://codeigniter.com/user_guide/general/profiling.html

它会给你一个SQL查询的细分,哪些是耗时的,在哪里。

$this->output->enable_profiler(TRUE);

问题似乎在我看来,你是查询数据库一次(或两次?)每行在您的CSV文件。
当然,你会得到糟糕的表现。
您可以一次完成整个查询,并让数据库立即为您生成CSV。

SELECT DISTINCT f1,f2,f3,... FROM tablex WHERE .. INTO OUTFILE 'c:/dir/ca.csv' 
  FIELDS ESCAPED BY '"' FIELDS TERMINATED BY ';' LINES TERMINATED BY ''n';
//note the use of forward slashes even on Windows.

见:http://dev.mysql.com/doc/refman/5.0/en/select-into.html

选择本身的速度是这里的限制因素。
确保你对目录有写权限,注意MySQL永远不会覆盖文件。

$id = $id;

真的吗?

ckr美元= $ this -> Manager_model -> check_if_record_exists (id、id2)美元;

让它运行得更快的一个明显的方法是在eid和id2上有一个唯一的索引,并且忽略INSERT上的重复行错误。

但是,如果你想让它运行得更快,只需告诉mysql解析并加载数据