它工作但是当我在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);
}
}
}
答案 0 :(得分:0)
使用MySQL transactions in CodeIgniter,它会加速一切(例如,制作500个项目的块并在一次交易中插入它们)。
但如果以错误结束,看起来问题可能就在其他地方。 2500不是那么多。
答案 1 :(得分:0)
csv中每行的迭代执行以下操作:
您可以尝试构建批量sql,如:
insert into table_name (f1, f2, f3) values ("val1", "val2", "val3"), ("val2_1", "val2_2", "val2_3"),...
大约100-200 '("val1", "val2", "val3")'
块它应该更快,但我不知道codeigniter缓存和其他东西怎么样......
答案 2 :(得分:0)
您可以将其打包在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
。