php - PHP/PDO - 以高性能方式将大型表输出为 JSON
问题描述
我有一些查询会输出大表。将代码简化为最重要的事情,它看起来像:
$pdo = new PDO(...);
$statement = $pdo->prepare($query);
$statement->execute($data);
$largeArray = $statement->fetchAll(PDO::FETCH_ASSOC);
$largeString = json_encode($largeArray);
echo $largeString;
它工作正常。但是如果我想产生一些非常大的输出呢?上面的代码必须将完整的输出存储在内存中。
一种选择是:
$pdo = new PDO(...);
$statement = $pdo->prepare($query);
$statement->execute($data);
echo '[';
if($line = $statement->fetch(PDO::FETCH_ASSOC)) {
echo json_encode($line);
while($line = $statement->fetch(PDO::FETCH_ASSOC)) {
echo ',';
echo json_encode($line);
}
}
echo ']';
但这是否以良好的性能运行?什么是更高效的解决方案?
解决方案
我要做的是分批获取 200 个
原因:每次加载批处理时,都会加载到机器内存中,这当然是非常有限的。
我建议将结果保存到 2000 的文件中
(批次或文件大小可能会有所不同,您可能应该找到适合您系统的最佳位置,但要保持较小)
为什么:即使这不是必须的,特别是如果您下次需要它时要分批加载它。但是,如果您打算在任何编辑器中打开它,您肯定需要等待一段时间,甚至导致应用程序崩溃。
如果可能的话,我是否建议将数据保存为 csv 而不是 json,对于大量转储,csv 的占用空间要小得多。此外,从 json 文件加载时,如果不进行一些黑客攻击,您将无法批量加载数据。使用 csv 你可以简单地逐行进行。
推荐阅读
- javascript - 将类作为 Javascript 中的参数传递给 Java
- vba - 从模板发送预先编写的电子邮件,并在正文中包含收件人姓名
- javascript - 将 originX 和 OriginY 设置为中心的绘制多边形会导致独立位移
- asp.net - SagePay 重定向 URL 失败
- c# - 在下面的代码中解释 GvrPointerInputModule.pointer
- stm32 - STM32F302: Only one DMA channel to transfer 2 registers from ADC
- android - Linkedin 如何在不通过浏览器的情况下如此快速地从电子邮件重定向到应用程序?
- java - selenium 自动化 - testng 框架
- python - Fastening the data extraction
- python - 如何在 python 中使用 tkinter 按钮在单击时更改 Canvas 背景颜色