代码之家  ›  专栏  ›  技术社区  ›  James

有效地从google数据存储中获取所有结果并以json格式返回

  •  2
  • James  · 技术社区  · 6 年前

    我有一个项目目前运行拉维5.7。

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

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

    前端向我的项目发出请求,我的项目向google数据存储发出请求,然后构建结果并将其作为json返回到前端。

    有相当一部分数据(目前是1200行),在屏幕上提取和渲染大约需要17秒。比我想的要长。

    这是我获取物联网数据的当前代码:

    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() 对数据存储的请求已完成 一秒钟之内 是的。但是循环遍历每一行,获取值,并将它们推送到数组中需要 14秒 是的。

    我好像找不到任何方法 $result 这将允许我撤出所有的结果,并且没有文档似乎暗示这样的方法存在。

    关于这个 GitHub issue 他们暗示使用 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 是的。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Alex    6 年前

    您确定对数据存储的请求在一秒钟内完成了吗?或者它只是创建了一个“query”对象,当您实际尝试读取值时,它会延迟加载。

    不管怎样,这里的日志术语计划是什么?必须有某种最大行数才能返回,对吧?

    我有一个类似的问题,我解决了这个JSON有效载荷作为一个文件在谷歌云存储每当改变了一些东西,然后我的请求处理程序正好服务该文件。