PHP-为什么读取这个csv文件会占用这么多内存,我如何改进代码?
情况是,我需要将一个相当大的csv文件(大约1/2百万条记录-80mb)导入mysql数据库。我知道我可以从命令行执行此操作,但我需要一个UI,以便客户端可以执行此操作 以下是我到目前为止的情况:PHP-为什么读取这个csv文件会占用这么多内存,我如何改进代码?,php,mysql,csv,import,laravel,Php,Mysql,Csv,Import,Laravel,情况是,我需要将一个相当大的csv文件(大约1/2百万条记录-80mb)导入mysql数据库。我知道我可以从命令行执行此操作,但我需要一个UI,以便客户端可以执行此操作 以下是我到目前为止的情况: ini_set('max_execution_time', 0); ini_set('memory_limit', '1024M'); $field_maps = array(); foreach (Input::get() as $field => $value){ if ('fieldm
ini_set('max_execution_time', 0);
ini_set('memory_limit', '1024M');
$field_maps = array();
foreach (Input::get() as $field => $value){
if ('fieldmap_' == substr($field, 0, 9) && $value != 'unassigned'){
$field_maps[str_replace('fieldmap_', null, $field)] = $value;
}
}
$file = app_path().'/../uploads/'.$client.'_'.$job_number.'/'.Input::get('file');
$result_array = array();
$rows = 0;
$bulk_insert_count = 1000;
if (($handle = fopen($file, "r")) !== FALSE)
{
$header = fgetcsv($handle);
$data_map = array();
foreach ($header as $k => $th){
if (array_key_exists($th, $field_maps)){
$data_map[$field_maps[$th]] = $k;
}
}
$tmp_rows_count = 0;
while (($data = fgetcsv($handle, 1000)) !== FALSE) {
$row_array = array();
foreach ($data_map as $column => $data_index){
$row_array[$column] = $data[$data_index];
}
$result_array[] = $row_array;
$rows++;
$tmp_rows_count++;
if ($tmp_rows_count == $bulk_insert_count){
Inputs::insert($result_array);
$result_array = array();
if (empty($result_array)){
echo '*************** array cleared *************';
}
$tmp_rows_count = 0;
}
}
fclose($handle);
}
print('done');
我目前正在处理一个本地漫游框,当我尝试在本地运行上面的程序时,它几乎处理csv文件的所有行,然后在结束前不久就消失了(没有错误),但它的内存限制达到了1.5Gb
我怀疑我在上述代码中所做的一些工作是不必要的,例如,我认为通过建立和插入有限数量的行,我可以减少内存使用,但这还不够
我怀疑这可能适用于具有更多可用内存的实时服务器,但我不能相信必须使用1.5Gb内存才能处理80mb文件,必须有更好的方法。非常感谢的任何帮助曾经有过这个问题,这为我解决了这个问题:
DB::connection()->disableQueryLog();
文档中关于它的信息:考虑改用加载数据填充,