【问题标题】:optimizing memory resources for a big query response为大查询响应优化内存资源
【发布时间】:2016-11-22 11:07:48
【问题描述】:

我必须执行一个查询,该查询可以生成一个非常大的字符串作为响应(最大 1Gb),这基本上是一个很大的 JSON 数组。是的,分页是有序的,但我强调这个概念是为了让你明白。 Symfony 只是使用学说来获得响应:

    $stmt = $this->getEntityManager()->getConnection()->prepare(self::Q_GET_NUM_TIMEBOX);

    $stmt->bindValue('t_end', $tEnd);
    $stmt->bindValue('t_granularity', $tGranularity);
    $stmt->bindValue('t_span', $varSelection->getStart());

    $stmt->execute();

    $resData = $stmt->fetchColumn(0);

然后我通过设置执行返回的内容来创建Response

    $res = new Response();
    $res->setStatusCode(200);
    $res->headers->set('Content-Type', 'application/json');
    $res->setContent($resData);

请记住,为了清楚起见,我过度简化了代码:我实际上有一个 controller、一个 handler 服务执行请求和一个 Repository 返回查询响应。

直接回到问题:这意味着 PHP 必须在内存中保存大量数据,我想知道是否有更轻松的方式来返回响应,以便使用大量数据减轻 PHP 引擎的压力。

【问题讨论】:

  • 将 StreamedResponse 与可迭代查询结果结合使用
  • @Matteo 仍然没有直接解决将此数据编码为 JSON 的问题。
  • @Gerry 不需要编码。 Postgres 返回一个编码良好的字符串。基本上我写的一个函数会生成并返回它
  • Ic,我从问题中误解了这一点。

标签: php symfony doctrine-orm symfony-2.8


【解决方案1】:

这意味着 PHP 必须保存大量数据

PHP 不需要将整个响应体保存在内存中。通过output buffers 和 Symfony response streaming,您可以逐行获取结果集并逐块发送数据。不幸的是,我不知道 PHP 中 JSON 流编码的行之有效的解决方案,但您可以手动实现它(12)。

更新(2017-02-27):

Streaming JSON Encoder 是一个 PHP 库,它提供了一组类来帮助以流方式对 JSON 进行编码,即允许您逐位编码 JSON 文档,而不是一次编码整个文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多