Я генерирую массив датрандж с помощью следующего метода: (даны $ from и $ to)
$begin = new DateTime(date('Y-m-d', $from));
$end = new DateTime(date('Y-m-d', $to));
$end = $end->modify('+1 day');
$dateInterval = new DateInterval('P1D');
$range = new DatePeriod($begin, $dateInterval, $end);
foreach ($range as $date) {
$dateIntervalArray[$date->format('Y-m-d\TH:i:s')] = array();
}
Затем я добавляю данные из запроса MySQL и сопоставляю их с массивом интервалов (здесь для ежечасной агрегации, однако) (это занимает большую часть общего времени)
foreach ($data as $item) {
$dateIntervalArray[date('Y-m-d\TH:00:s', $item->PointOfTime - 900)][] = $item->measurement;
}
На последнем шаге я собираю данные:
foreach ($dateIntervalArray as $key => $item) {
$arraySum = array_sum($item);
array_push($energyData, array(
'PointOfTime' => strtotime($key),
'ValueHT' => $arraySum
));
// Further, I calculate e.g. min/max
// find min per hour
// find max per hour
// Sum per hour
// Total sum
// Total average
}
Это отлично работает! Однако это медленно с большим количеством данных. Я получил 96 комплектов в день, что составляет почти 35000 данных в год. Если я получу еще больше данных, как это обычно бывает, я имею дело с почти 350 000 данных. Занимает ~ 6-7 секунд, чтобы сделать в моем веб-интерфейсе.
Q: Как я могу улучшить это?
Я думал о вычислении этого MySQL, однако мне нужно максимальное значение в час, даже если я суммирую по дням или месяцам. Идеи?
Задача ещё не решена.
Других решений пока нет …