Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-为什么读取这个csv文件会占用这么多内存,我如何改进代码?_Php_Mysql_Csv_Import_Laravel - Fatal编程技术网

PHP-为什么读取这个csv文件会占用这么多内存,我如何改进代码?

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

情况是,我需要将一个相当大的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 ('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();

文档中关于它的信息:

考虑改用加载数据填充,