PHP数组内存使用情况

时间:2013-08-12 00:08:32

标签: php arrays memory

我正在尝试找到一种将大量字符串映射到整数的方法。我尝试使用数组,发现了一个我不明白的行为。当我按字符串索引数组(array('someStirng'=> 1))时,它消耗的内存少于内存(array(1 =>'someString'))。这是不是意味着,最好按字符串索引数组,并将int作为大量string-int对的值或者什么是catch?为什么会有如此大的内存分配差异?

function gen() {
    static $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randomString = '';
    for ($i = 0; $i < 8; $i++) {
        $randomString .= $characters[rand(0, strlen($characters) - 1)];
    }
    return $randomString;
}

按字符串索引 - 返回490 KB

$a = array();

for($x = 0;$x < 100000;$x++){
    $a[gen()]  = $x;
}


echo (memory_get_usage() / 1024) . ' KB';

按整数编制索引 - 返回10790.2890625 KB(比第一种情况多〜22倍,但存储的信息量相同!)

$a = array();

for($x = 0;$x < 100000;$x++){
    $a[$x]  = gen();
}


echo (memory_get_usage() / 1024) . ' KB';

2 个答案:

答案 0 :(得分:1)

当我使用你的代码重复你的实验时,我得到18 072 000字节的整数索引和16 471 960字节的字符串索引。差别不大,这可归因于数组键及其值的不同内存管理。

使用memory_get_peak_usage(true)代替产生非常相似的结果。在for循环之前和之后计算内存使用量的差异,我得到18 087 936字节的整数索引和16 515 072字节的字符串索引。

这是一个很小的差异,可以通过数组键和数组值的不同内部内存管理来解释。也许由于数组键仅限于标量而数组值不受限制,因此PHP可以在某处进行优化。

无论如何,像@ ed-heal所说,使用最好的数据结构来做你想做的事。内存使用量可能不是 重要的,如果是,PHP可能不是该工作的工具。

答案 1 :(得分:0)

此循环

 for ($i = 0; $i < 8; $i++) {

有8次开展业务

这个循环在哪里

for($x = 0;$x < 100000;$x++){

再多一点!

现在让我想一想问题出在哪里......

修改

注意到沙子已经移动了。

使用适合手头任务的任何数据结构。