存储在PHP数组中的数据量

时间:2012-09-19 09:26:33

标签: php arrays debugging size

我正在寻找一种方法来衡量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中存储在数组中的数据量? /强>

2 个答案:

答案 0 :(得分:1)

这是否有效:

<?php
    $arr = array('abc'=>123);
    echo strlen(implode('',array_keys($arr)).implode('',$arr));
?>

答案 1 :(得分:0)

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

您可以尝试以下方法:

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

但是要估算数组的 true 内存占用量,您将需要做的还远远不够。如果您正在寻找一个大概的估计,则阵列要比其序列化版本多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),它也不是很精确。 PHP会按较大的块分配内存,以避免随着字符串/数组/其他内容的增长(例如在for(...) $x.="yada"情况下)而产生的明显开销。

我希望我能说些有用的东西。