首页 > 解决方案 > 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 ']';

但这是否以良好的性能运行?什么是更高效的解决方案?

标签: phpjsonpdo

解决方案


我要做的是分批获取 200 个

原因:每次加载批处理时,都会加载到机器内存中,这当然是非常有限的。

我建议将结果保存到 2000 的文件中

(批次或文件大小可能会有所不同,您可能应该找到适合您系统的最佳位置,但要保持较小)

为什么:即使这不是必须的,特别是如果您下次需要它时要分批加载它。但是,如果您打算在任何编辑器中打开它,您肯定需要等待一段时间,甚至导致应用程序崩溃。

如果可能的话,我是否建议将数据保存为 csv 而不是 json,对于大量转储,csv 的占用空间要小得多。此外,从 json 文件加载时,如果不进行一些黑客攻击,您将无法批量加载数据。使用 csv 你可以简单地逐行进行。


推荐阅读