用PHP读取大型csv文件的最快方法是什么?

时间:2019-12-11 05:55:56

标签: php csv large-files

服务器中有一些csv文件。这些csv文件每分钟创建一次。 目的是读取最后创建的csv文件并制作图形。 csv文件大小可能为300MB或更大,并且文件可能包含500000行或更多。我当前的代码可以读取25MB的csv文件,其中包含约130000行,并且需要很长时间。如果文件变大,则显示“ HTTP ERROR 500”。我还检查了PHP错误日志。它显示为“已用完536870912字节的内存大小(尝试分配20480字节)”。

我从stackoverflow读到了关于此问题的一些答案。但这并不能解决我的问题。那么,如何才能有效地解决这个问题?

这是我的代码:

 ini_set('memory_limit', '512M');
 ini_set('max_execution_time', '180');
 $dir = DATA_DIR . '/' . date("Y") . '/' . date("md");

// copy filenames to array
$files = array();
$files = glob($dir."/*.csv");

// sort files by last modified date
usort($files, function($x, $y) {
    return filemtime($x) < filemtime($y);
});

$baseFile = [];
foreach($files as $file) {

    if (($handle = fopen($file, "r")) !== FALSE) {
        $baseFile[] = basename($file);
        fclose($handle);
    } else {
        echo "Could not open file: " . $file;
    }

}

$rows = array();
$table = array();

// create table columns
$table['cols'] = array(
array(
'label' => 'Time',
'type' => 'datetime'
),
array(
'label' => 'Temperature (°C)',
'type' => 'number'
)
);

// read csv file 
$csvFile = file($dir . '/' . $baseFile[0]);
// keep csv data in an array
$data = [];
foreach ($csvFile as $line) {
      $data[] = str_getcsv($line);
}

foreach ($data as $key => $value) {
$sub_array = array();
// Returns date formatted according to given format
$date = new DateTime($value[0]);
$time = new DateTime($value[1]);
$datetime = new DateTime($date->format('Y-m-d') .' ' .$time->format('H:i:s'));
$datetime = $datetime->format('Y-m-d H:i:s');
// converting an English textual date-time description to a UNIX timestamp
$datetime = strtotime($datetime);
$sub_array[] =  array("v" => 'Date('.$datetime. '000)');
$temperature = $value[27]/1000;
$sub_array[] =  array("v" => $temperature);
$rows[] =  array("c" => $sub_array);
}

$table['rows'] = $rows;

// return a json encoded string
$jsonTable = json_encode($table);

0 个答案:

没有答案