0

我正在寻找一种方法来测量存储在PHP数组中的数据量。我不是在谈论数组中的元素数量(您可以用 来count($array, COUNT_RECURSIVE)计算),而是所有键及其对应值的累积数据量。例如:

array('abc'=>123); // size = 6
array('a'=>1,'b'=>2); // size = 4

因为我感兴趣的是数量级而不是确切的数量(我想比较处理内存和时间使用与数组的大小),所以我考虑使用以下技巧:

strlen(print_r($array,true));

然而,来自的开print_r销量取决于数组的结构,这并不能给我一致的结果:

echo strlen(print_r(array('abc'=>123),true)); // 27
echo strlen(print_r(array('a'=>1,'b'=>2),true)); // 35

有没有办法(理想情况下在单行中并且不会影响太多性能,因为我需要在生产运行时执行此操作)来测量 PHP 中存储在数组中的数据量?

4

2 回答 2

1

这是否可以解决问题:

<?php
    $arr = array('abc'=>123);
    echo strlen(implode('',array_keys($arr)).implode('',$arr));
?>
于 2012-09-19T09:29:57.097 回答
0

简短回答:不可能完成的任务

您可以尝试以下方法:

    strlen(serialize($myArray))     // either this
    strlen(json_encode($myArray))   // or this

但是要近似一个数组的真实内存占用量,您将不得不做更多的事情。如果您正在寻找一个大概的估计值,数组需要比其序列化版本多 3-8 倍,具体取决于您在其中存储的内容以及您拥有的元素数量。随着阵列的增长,它会逐渐增加,越来越大。为了让您了解正在发生的事情,经过数小时的尝试,我想出了一个数组估计函数,仅适用于单级数组:

function estimateArrayFootprint($a) { // copied from one of my failed quests :(
    $size = 0;
    foreach($a as $k=>$v) {
        foreach([$k,$v] as $x) {
            $n = strlen($x);
            do{
                if($n>8192 ) {$n = (1+($n>>12)<<12);break;}
                if($n>1024 ) {$n = (1+($n>> 9)<< 9);break;}
                if($n>512  ) {$n = (1+($n>> 8)<< 8);break;}
                if($n>0    ) {$n = (1+($n>> 5)<< 5);break;}
            }while(0);
            $size += $n + 96;
        }
    }
    return $size;
}

所以这很容易,不是。再说一次,这不是一个可靠的估计,它可能取决于 PHP 内存限制、架构、PHP 版本等等。问题是您需要这个值的准确程度。

另外,我们不要忘记这些值来自memory_get_usage(1)也不是很精确的 a。PHP 以大块的形式分配内存,以避免在您的字符串/数组/其他任何内容增长时产生明显的开销,例如在某种for(...) $x.="yada"情况下。

我希望我能说一些更有用的话。

于 2020-05-20T12:48:12.697 回答