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

У меня есть проект, в котором сейчас работает 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.


person James    schedule 20.09.2018    source источник


Ответы (1)


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

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

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

person Alex    schedule 05.10.2018
comment
Я фактически зарегистрировал это как проблему в репозитории Google PHP. Вы правы насчет запроса, он загружается лениво и запускается только тогда, когда вы пытаетесь прочитать данные. Еще несколько тестов подтвердили, что в центре обработки данных в Сиднее есть некоторые проблемы со скоростью, и они сейчас их изучают. Максимальное количество строк будет около 1500, а 95% — около 1200. Ваша идея файла интересна, вы извлекаете существующую полезную нагрузку json, добавляете к ней, а затем сохраняете? - person James; 06.10.2018
comment
Нет, я просто заново генерирую его каждый раз. Но ваши потребности могут различаться в зависимости от того, как часто происходят события. - person Alex; 06.10.2018