php - json_decode 和内存清除

标签 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() 之外什么也没做,没有分配变量或其他任何东西。那么为什么我的内存会长成这样,我该如何清除它呢?

最佳答案

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

或者

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

并且您应该取消设置未使用的变量以清除内存。

unset($decoded_data);

或设置

$var = null

当您使用 unset 时,内存只会在垃圾收集器决定时被释放,但是当您将变量设置为不同的值(在本例中为 null)时,您当然可能会释放一些内存,但代价是的 CPU。

我会推荐你​​使用

https://github.com/salsify/jsonstreamingparser

This is a simple, streaming parser for processing large JSON documents. Use it for parsing very large JSON documents to avoid loading the entire thing into memory, which is how just about every other JSON parser for PHP works.

关于php - json_decode 和内存清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47155877/

相关文章:

php - 使用 POST 方法的 LightOpenID 身份验证

php - 更快的 MySQL 加入 DISTINCT 记录

PHP/MYSQL 返回数组如何执行 foreach

c - opencl 映射内存不起作用

Python 大字节数组内存

tomcat - 增加Tomcat内存设置

php - 将简单的Dockerfile转换为docker-compose

php - 使用社区 SDK 与 Google、Facebook、Twitter 进行身份验证

java - 如何在 HP-UX 上设置 Java 程序内存限制(-Xmx 不起作用!)?

c - 访问冲突 strcpy