2

我有一个目前正在运行 Laravel 5.7 的项目。

我有一堆物联网传感器正在将数据发送到谷歌数据存储区。

我想查询这些数据,以便我可以在我的应用程序的前端显示这些数据的图表。

前端向我的项目发出请求,我的项目向 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 Library

4

1 回答 1

0

Are you sure the request to datastore finished within a second? Or did it just create a 'query' object and it lazy loaded when you actually tried reading values.

Regardless, what's the log term plan here? There has to be some kind of max number of rows you would return here right?

I had a similar issue that I solved by saving this json payload as a file in google cloud storage everytime something changed and then my request handler just served that file instead.

于 2018-10-05T23:03:25.000 回答