У меня есть проект, в котором сейчас работает Laravel 5.7.
У меня есть куча датчиков IoT, которые отправляют данные в хранилище данных Google.
Я хочу запросить эти данные, чтобы показать график этих данных в интерфейсе моего приложения.
Внешний интерфейс отправляет запрос в мой проект, мой проект отправляет запрос в хранилище данных Google, а затем создает результат, чтобы вернуть его в виде JSON во внешний интерфейс.
Данных довольно много (в настоящее время 1200 строк), и их получение и отображение на экране занимает около 17 секунд. Что длиннее, чем хотелось бы.
Вот мой текущий код для получения этих данных IoT:
public function fetchData()
{
dump("GDS query starting " . date("Y-m-d H:i:s"));
$query = $this->datastore->query()
->kind('IotEvent')
->filter('device_id', '=', 'abc123')
->filter('published_at', '>=', '2018-09-19T04:52:01.429Z')
->order('published_at', Query::ORDER_ASCENDING)
->projection(['current_temperature', 'target_temperature', 'published_at']);
$results = $this->datastore->runQuery($query);
dump("GDS query finished " . date("Y-m-d H:i:s"));
return($this->transformData($results));
}
private function transformData($results)
{
dump("GDS transform starting " . date("Y-m-d H:i:s"));
$data = [];
foreach ($results as $result) {
array_push($data, $result->get());
}
dump("GDS transform finished " . date("Y-m-d H:i:s"));
return $data;
}
Согласно dump()
s, запрос к хранилищу данных выполняется в течение секунды. Но перебор каждой строки, получение значений и помещение их в массив занимает 14 секунд.
Кажется, я не могу найти какой-либо метод на $result
, который позволил бы мне получить все результаты, и никакая документация, похоже, не намекает на существование такого метода.
В этой проблеме GitHub они намекают на использование iterator_to_array()
, чего я никогда не слышал раньше. Однако использование его, как показано ниже, просто возвращает мне кучу пустых объектов JSON в моем интерфейсе:
private function transformData($results)
{
dump("GDS transform starting " . date("Y-m-d H:i:s"));
$data = iterator_to_array($results, false);
dump("GDS transform finished " . date("Y-m-d H:i:s"));
return $data;
}
Есть ли способ сделать этот процесс намного быстрее или что-нибудь, что я могу сделать, чтобы оптимизировать текущий процесс зацикливания каждой строки? После того, как в рабочей среде каждый запрос на получение данных, можно ожидать, что он вернет около 5000 строк, так что в 5 раз больше, чем я сейчас получаю.
Я использую официальную библиотеку хранилища данных Google.