服务器中有一些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);