【问题标题】:Memory exhausted error for json_parse with PHP使用 PHP 的 json_parse 的内存耗尽错误
【发布时间】:2011-06-23 19:16:27
【问题描述】:

我有以下代码:

<?php
$FILE="giant-data-barf.txt";

$fp = fopen($FILE,'r');

//read everything into data
$data = fread($fp, filesize($FILE));
fclose($fp);

$data_arr = json_decode($data);
var_dump($data_arr);
?>

giant-data-barf.txt 文件,顾名思义,是一个巨大的文件(现在是 5.4mb,但可能会达到几 GB)

执行此脚本时,出现以下错误:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 71 bytes) in ........./data.php on line 12

我查看了可能的解决方案,并看到了这个:

ini_set('memory_limit','16M');

我的问题是,我应该设置多大的内存有限制吗?或者有没有更好的方法来解决这个问题?

【问题讨论】:

  • 这可能不是 PHP 完全适合的工作。可以使用命令行工具吗?
  • 一个文件大小的平面文件存储会给你带来很多问题。使用 sqlite 或 mysql。如果该文件仅包含一个已被 json 编码的变量并且它是如此之大,那么您不太可能能够解决这个问题。 json 不适用于如此大的文件。使用数据库,或者将其存储在 CSV 中,或者将每一行存储在 json 中而不是整个事物中
  • 唯一的问题是,有人正在以 JSON 格式向我导出整个数据库...
  • JSON 流解析器怎么样? github.com/salsify/jsonstreamingparser

标签: php memory scripting json


【解决方案1】:

我已为我的所有服务器分配了 100M 的 memory_limit... 还没有遇到问题。

我会考虑以某种方式拆分该文件,或者摆脱它并使用数据库

【讨论】:

  • 有没有办法将 JSON 文件导入数据库?
  • @TonyStark 使用中间人自定义编写的应用程序来获取该文件并将其转换为 MySQL 可以理解的内容,当然。使用当前工具来做到这一点?我对此表示怀疑。有更好的方法来解决这个问题。
  • 不知道...以前从未这样做过:/
  • 我建议你永远不要这样做!看我的回答;-)
  • 那么将大型 json 文件/对象加载到 mysql 数据库中的方法是什么?我的意思是 json_decode 会抛出内存不足的消息!
【解决方案2】:

这是一个非常糟糕的想法,也就是说,您需要设置

ini_set('memory_limit',filesize($FILE) + SOME_OVERHEAD_AMOUNT);

因为您正在将整个内容读入内存。您可能必须将内存限制设置为文件大小的两倍,因为您想要JSON_DECODE

请注意,在网络服务器上,这将消耗大量内存,如果文件如您所说的那样有很多 GB,您不应该这样做!!!!

它真的是一个 giant JSON blob吗?您应该考虑将其转换为数据库或其他格式,您可以在使用 PHP 解析 之前 使用随机或行访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 2011-07-12
    相关资源
    最近更新 更多