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。
它现在可以处理数十亿行。
所以如果有人遇到同样的问题,我真的建议这样做:)
我必须将 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。
它现在可以处理数十亿行。
所以如果有人遇到同样的问题,我真的建议这样做:)