【问题标题】:PHP uses more memory than the file requiredPHP 使用的内存比所需的文件多
【发布时间】:2018-11-24 17:33:55
【问题描述】:

以给定的示例代码为例:

<?php

if (! function_exists('human_filesize')) {
    function human_filesize($size, $precision = 2, $step = 1000)
    {
        $i = 0;
        $units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];

        while (($size / $step) > 0.9) {
            $size = $size / $step;

            $i++;
        }

        return round($size, $precision) . ' ' . $units[$i];
    }
}

if (! function_exists('dd')) {
    function dd($vars)
    {
        foreach (func_get_args() as $var) {
            var_dump($var);
        }

        die();
    }
}

$start = microtime(true);
$usage = memory_get_usage(true);

require "brown_corpus.php"; // It's 1.6 MB

$dump[] = round(microtime(true) - $start, 3);
$dump[] = human_filesize(memory_get_usage(true) - $usage);

dd(...$dump); // 0.063ms to run | 38.01 MB memory used

brown_corpus.php 是 1.6 MB,但是当需要时,脚本告诉我它正在使用 38.01 MB 的内存。我一直在阅读,我想知道这是否是因为 PHP 将所需的文件编译成操作码,以便更快地执行?有人可以启发一下这方面的利弊吗...即,如果我继续在该要求的数组中搜索键,现在是否更快 - 因为 PHP 编译文件的方式?

【问题讨论】:

    标签: php memory memory-management


    【解决方案1】:

    文件的大小与它消耗的内存量无关。没有看到 brown_corpus.php,就不可能知道它是如何消耗内存的,但请记住,代码(通常)是描述它实际创建的结构的一种浓缩方式。考虑以下几点:

    $arr = array();
    for ($i = 0; $i < 100000; $i++) {
        $arr[$i] = $i;
    }
    

    把它保存到一个 php 文件中,它占用大约 70 个字节。运行它,它将创建一个包含 100,000 个元素的数组结构,每个元素都是一个 8 字节的整数。繁荣,使用了 800 KB。

    实际上它比这更糟糕,因为 PHP 是如何在您的系统上配置的,更不用说 PHP 强加的各种开销(例如,它存储数组的方式令人难以置信——参见 @987654321 @)。

    【讨论】:

    • 那些文章似乎真的很好地解释了这一点。 brown_corpus 包含许多键/值对的返回数组。所以这可以解释当需要进入内存时如何消耗更多的字节。我想知道数据库查找是否会更好,但脚本肯定需要更长的时间才能运行,但内存占用更少。很快就会给予赏金......
    • 是的,不同类型的内存使用范围很广。您可以在任何变量分配之前和之后执行 memory_get_usage() 以大致了解该类型或结构使用了多少,但值会因系统而异。如果您希望在时间方面比较不同的方法,我建议您使用 microtime() 来测量每个方法所花费的时间。请参阅php.net/manual/en/function.microtime.php 上的第一个示例。
    猜你喜欢
    • 1970-01-01
    • 2021-03-02
    • 2016-12-02
    • 1970-01-01
    • 2017-01-28
    • 2015-07-23
    • 2010-11-25
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多