我有一个大型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(),没有赋值变量或其他任何东西,我在这个例子中什么都不做。那么为什么我的记忆会像这样增长,我该如何清除呢?
答案 0 :(得分:0)
检查您尝试获取内容的文件的大小。这可能会更大,因此需要花费内存使用
或者
您需要检查哪个变量占用过多内存,您可以使用strlen()
它不会为您提供由var保存的精确内存,但长度有助于查找近似值。
你应该unset
未使用的变量来清除内存。
unset($decoded_data);
或设置
$var = null
当你使用unset时,只有当垃圾收集器决定时才会释放内存,但是当你将一个变量设置为一个不同的值(在这种情况下为null)时,你可能会得到一些内存,当然会有成本CPU。
我建议你使用
https://github.com/salsify/jsonstreamingparser
这是一个简单的流式解析器,用于处理大型JSON 文档。使用它来解析非常大的JSON文档以避免 将整个东西加载到内存中,这几乎是每一个 用于PHP的其他JSON解析器。