APYDataGridBundle - 导出大量数据失败

APYDataGridBundle - export a lot of data fails

我必须将 50000 行从 table 导出到 Excel(或 CSV)。将来,这将是百万甚至更多。导出功能是我选择这个包的原因,但现在我发现这是一个错误。

当行数超过几千时,捆绑就会失败。我认为这是因为内存限制。

我发现了这个:

public function computeData($grid)
    {
        $data = $this->getGridData($grid);

        $this->content = '<table border=1>';
        if (isset($data['titles'])) {
            $this->content .= '<tr>';
            foreach ($data['titles'] as $title) {
                $this->content .= sprintf("<th>%s</th>", htmlentities($title, ENT_QUOTES));
            }
            $this->content .= '</tr>';
        }

        foreach ($data['rows'] as $row) {
            $this->content .= '<tr>';
            foreach ($row as $cell) {
                $this->content .= sprintf("<td>%s</td>", htmlentities($cell, ENT_QUOTES));
            }
            $this->content .= '</tr>';
        }

        $this->content .= '</table>';
    }

好像是一次把所有的数据放到一个变量里。

至少捆绑包允许创建自己的导出 class。任何人都知道这个包如何允许例如逐页获取数据?我认为这应该足够了。我找不到任何方法来执行此操作。

我放弃了使用 APY Grid,因为它很慢,而且我想做的每一件事都太复杂了。

所以我决定使用 AngularJS 构建 table。我花了大约 4 个小时。现在它看起来更好,速度更快。

使用我自己的函数,我现在能够按照我想要的方式导出数据。为此,我使用了 StreamedResponse,这是我本周的发现。我对数据进行分页,在每页之后清除实体管理器并将页面数据逐页发送给接收者。不管脚本处于哪个阶段,它使用的内存都少于 20MB。

它现在可以处理数十亿行。

所以如果有人遇到同样的问题,我真的建议这样做:)