Эффективно получить все результаты из Google Datastore и вернуть в виде JSON

У меня есть проект, в настоящее время работающий с Laravel 5.7.

У меня есть куча датчиков IoT, которые отправляют данные в Google Datastore.

Я хочу запросить эти данные, чтобы я мог показать график этих данных на веб-интерфейсе моего приложения.

Интерфейс отправляет запрос в мой проект, мой проект отправляет запрос в Google Datastore, а затем создает результат, чтобы вернуть его в виде 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 запрос в Datastore выполнен в течение секунды. Но зацикливание на каждой строке, получение значений и отправка их в массив занимает 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 Datastore.

2

Решение

Вы уверены, что запрос к хранилищу данных завершился в течение секунды? Или же он просто создал объект «запрос», и он лениво загружался, когда вы на самом деле пытались читать значения.

Независимо от того, что план плана регистрации здесь? Должно быть какое-то максимальное количество строк, которое вы бы вернули здесь, верно?

У меня была похожая проблема, которую я решил, сохраняя эту полезную нагрузку json как файл в облачном хранилище Google каждый раз, когда что-то менялось, и тогда мой обработчик запросов просто обслуживал этот файл.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]