【问题标题】:PHP memory exhausted ( json_decode)PHP 内存耗尽(json_decode)
【发布时间】:2014-09-08 09:27:09
【问题描述】:

当我的应用程序尝试解码大型(15K~ 行)JSON 字符串(来自 CURL)时,它失败了:

134217728字节的允许内存大小用尽(尝试分配91字节)

我知道我可以扩大或解除内存限制,但我宁愿避免这样做。我一直想知道是否有不同的方法来解决这类问题——比如将 JSON 字符串分成小块(如array_chunk)。

更新

为了确保问题不是由应用程序中的任何其他函数/循环引起的,我已将 JSON 字符串提取到一个文件中,并尝试直接从该文件中对其进行解码(文件大小 = 11.8MB)。仍然失败。

$y = json_decode( file_get_contents('/var/tmp/test.txt') );

更新 2 该脚本在 Mac OS X 环境中运行。我也在 Ubunto env 上测试过它(也是 128M 内存限制)——它在那里工作得很好。我应该担心吗?

【问题讨论】:

  • 这个 JSON 字符串到底有多大?因为 128Mb 是很多内存...
  • 行数不代表大小
  • 那 15k 行每行有多少数据(大约多少)?将帮助那里决定如何最好地帮助你。还有其他任何事情发生,例如作为循环的一部分传递允许的内存的部分......? (例如,即使 json 是发生错误的地方,也可能不是循环中的较早实例发生内存泄漏的原因)
  • @NiettheDarkAbsol "MB" 不是 "Mb"。显着差异。
  • @MarcinOrlowski 哎呀,确实。再说一次,128Mb (16MB) 仍然是在单个 PHP 脚本中使用的大量 RAM。

标签: php json memory


【解决方案1】:

在 php 中迭代大 json 文件的最简单方法之一是使用halaxa/json-machine。你只写一个foreach。它永远不会达到内存限制,因为它在后台一次解析一项,因此无论文件大小如何,内存消耗都是恒定的。

【讨论】:

    【解决方案2】:

    要永久避免这种情况,请使用基于事件的 JSON 解析器,例如 https://github.com/salsify/jsonstreamingparser

    这样,整个事情就不必一次在内存中。相反,您处理的事件一次给您一个对象/数组。

    【讨论】:

      【解决方案3】:

      没有其他 PHP 函数可以让您解码 JSON 字符串。您可以自行尝试或查找库将 JSON 拆分为多个部分。

      但是,您应该确保这是唯一的问题。例如,在解码 JSON 数据之前,您可能会创建大数组或创建许多对象。

      如果我是你,我会将此 json 字符串保存到文件并编写额外的脚本,只是为了从文件中获取它并进行解码,以确保使用 json_decode 是唯一的问题。

      【讨论】:

        猜你喜欢
        • 2015-10-01
        • 2013-07-06
        • 2014-06-28
        • 2011-04-20
        • 1970-01-01
        • 2013-07-22
        • 2014-06-30
        • 2015-07-02
        相关资源
        最近更新 更多