Php 如何使CSV上传速度更快?
我想知道你们中是否有人尝试过在实时表单(多部分/表单数据)中进行CSV迁移。我唯一讨厌的是,它占用了太多的时间,并且正在达到最大执行超时。我所做的快速修复是通过在php.ini中设置最大执行时间(或set_time_limit()),但是我真的很讨厌等待半个小时才导入整个数据,尽管它不超过100kb。我是不是反应过度了 代码如下: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']
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.