我正在寻找一种方法来衡量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中存储在数组中的数据量? /强>
答案 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"
情况下)而产生的明显开销。
我希望我能说些有用的东西。