Эффективно получить все результаты из Google Datastore и вернуть в виде JSON - PullRequest
0 голосов
/ 20 сентября 2018

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

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

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

Внешний интерфейс отправляет запрос в мой проект, мой проект отправляет запрос в Google Datastore, а затем создает результат, чтобы вернуть его в виде JSON вfrontend.

Существует довольно много данных (в настоящее время 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 .

1 Ответ

0 голосов
/ 06 октября 2018

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

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

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

...