Php 如何使CSV上传速度更快?

Php 如何使CSV上传速度更快?,php,mysql,codeigniter,optimization,csv,Php,Mysql,Codeigniter,Optimization,Csv,我想知道你们中是否有人尝试过在实时表单(多部分/表单数据)中进行CSV迁移。我唯一讨厌的是,它占用了太多的时间,并且正在达到最大执行超时。我所做的快速修复是通过在php.ini中设置最大执行时间(或set_time_limit()),但是我真的很讨厌等待半个小时才导入整个数据,尽管它不超过100kb。我是不是反应过度了 代码如下: function upload($id, $old_eid) { $filename = $_FILES['event_file']['tmp_name']

我想知道你们中是否有人尝试过在实时表单(多部分/表单数据)中进行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>');
} 
附言。
我这里不是说PhpMyAdmin,因为我知道导入csv文件在那里是如何工作的。另外,如果有一个文件要使用骨骼进行迁移,则会创建很多琐碎的任务

在我看来,问题是您在CSV文件中每行查询DB一次(或两次)。
当然你会得到糟糕的表现。
您可以一次性完成整个查询,并让DB立即为您制作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.
见:

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

这个命令在MySQL上非常快。

为什么不运行探查器来优化代码?Codeigniter包含了这篇有用的文章,用于解决类似的问题

它将为您提供SQL查询的详细信息,以及需要花费的时间和地点

$this->output->enable_profiler(TRUE)

$id=$id

真的吗

$ckr=$this->Manager\u model->检查\u记录是否存在($id,$id2)

一个明显的加速方法是在eid和id2上有一个唯一的索引,并忽略INSERT上的重复行错误


但实际上,如果您想让它运行得更快,只需。

您如何处理这些数据?30分钟处理100KB的速度太慢了。您可能想发布一段您正在使用的“工作”代码。我不知道,但这真的很烦人,可能是因为我要导入到两个不同的表,并检查行是否与以前的行相同。大概我不知道。但它不应该占用这么多时间,对吗?@xxxo\u tryme向我们展示您的代码,我们会告诉您的you@xxxo_tryme啊哈,也许这个行检查算法真的很低效。
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.