json_decode和内存清除

时间:2017-11-07 10:41:44

标签: php memory

我有一个大型JSON文件列表(最小文件为500 Ko,最大文件为100 Mo)。

我需要独立处理每个文件。我的问题是每个文件后内存使用量越来越多,即使我清除了所有内存。

示例:

foreach ($files as $file) {
    json_decode(file_get_contents($file->getRealpath()), true);

    $memory = memory_get_usage(true);
    echo 'Memory: '.@round($memory / pow(1024,($i=floor(log($memory, 1024)))), 2).' '.['b', 'kb', 'mb', 'gb', 'tb', 'pb'][$i]."\n";

    gc_collect_cycles();
}

结果:

Memory: 6 mb
(...)
Memory: 6 mb
Memory: 6 mb
Memory: 10 mb
Memory: 10 mb
Memory: 10 mb
(...)
Memory: 12 mb
Memory: 12 mb
Memory: 12 mb
(...)
Memory: 490 mb
Memory: 490 mb
Memory: 490 mb
(...)
Memory: 946 mb
Memory: 944 mb
Memory: 944 mb
(...)

内存越来越多,直到PHP告诉我他无法获得更多。正如你所看到的,除了json_decode(),没有赋值变量或其他任何东西,我在这个例子中什么都不做。那么为什么我的记忆会像这样增长,我该如何清除呢?

1 个答案:

答案 0 :(得分:0)

检查您尝试获取内容的文件的大小。这可能会更大,因此需要花费内存使用

或者

您需要检查哪个变量占用过多内存,您可以使用strlen()它不会为您提供由var保存的精确内存,但长度有助于查找近似值。

你应该unset未使用的变量来清除内存。

unset($decoded_data);

或设置

$var = null

当你使用unset时,只有当垃圾收集器决定时才会释放内存,但是当你将一个变量设置为一个不同的值(在这种情况下为null)时,你可能会得到一些内存,当然会有成本CPU。

我建议你使用

https://github.com/salsify/jsonstreamingparser

  

这是一个简单的流式解析器,用于处理大型JSON   文档。使用它来解析非常大的JSON文档以避免   将整个东西加载到内存中,这几乎是每一个   用于PHP的其他JSON解析器。