【问题标题】:Memory size exhaused while putting data into array将数据放入数组时内存大小耗尽
【发布时间】:2018-02-20 23:52:14
【问题描述】:

我正在尝试从数据库中获取数据并将其存储到 JSON 文件中。 下面的脚本工作正常,但较大的数据表不起作用:

# SELECT Data from Table
$query = "SELECT `Row1`, 
                 `Row2`, 
                 `Row3`
          FROM   `Table`";
$result = $mysqli->query( $query );

# Declare array 
$data = array();

# Put Data into array
while ( $row = $result->fetch_assoc() ) {
  $data[] = $row;
}

# Put Data into JSON
$JSONData = json_encode( $data, JSON_PRETTY_PRINT );

但较大的表格不起作用: 致命错误:已用完允许的 104857600 字节的内存大小。

错误发生在“Put Data into array”段中(参见上面的代码)。

还有其他方法可以将数据转换成 JSON 吗?

【问题讨论】:

  • php.ini 文件中增加 PHP 允许的内存大小。
  • 使用streaming json encoder....之类的东西,但不要尝试在服务器上将其格式化为 PRETTY_PRINT
  • 问题不在于将数据转换为 JSON 的方式,您有太多数据。您真的需要同时存储内存中的所有数据吗?
  • 我需要将一个大表从服务器 A 传输到服务器 B,我认为 JSON 可以做得很好。
  • 逐个转移?一次或多次记录数千条记录,然后再次

标签: php arrays json memory


【解决方案1】:

除了 Mark Ba​​ker 的回应,这里是流式传输到 json 的临时解决方案:

# SELECT Data from Table
$query = "SELECT `Row1`, 
             `Row2`, 
             `Row3`
      FROM   `Table`";
$result = $mysqli->query( $query );

header("Content-Type: application/json");
echo "[";
# Put Data into array
$first = true;
while ( $row = $result->fetch_assoc() ) {
      echo (!$first?",":"").json_encode($row);
      $first = false;
}
echo "]";
die();

现在问题来了。您不能将数据放在数组或字符串中,您只能传输它。此外,如果您使用输出缓冲(使用ob_start),您仍然会耗尽内存。

【讨论】:

    猜你喜欢
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    相关资源
    最近更新 更多