1

我正在尝试找到一种将大量字符串映射到整数的方法。我使用数组进行了尝试,发现了一种我不理解的行为。当我按字符串(array('someStirng' => 1))索引数组时,它消耗的内存比反之(array(1 =>'someString'))要少。这是否意味着,最好按字符串索引数组并将整数作为大量字符串-整数对的值,或者有什么问题?为什么内存分配差异这么大?

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';
4

2 回答 2

1

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

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

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

在任何情况下,就像@ed-heal 所说的那样,无论你想要做什么,都要使用最好的数据结构。内存使用可能并不那么重要,如果是,PHP 可能不是这项工作的工具。

于 2013-08-12T01:03:31.263 回答
0

这个循环

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

有8次做生意

这个循环在哪里

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

是不是多一点!

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

编辑

刚刚注意到沙子已经移动了。

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

于 2013-08-12T00:27:16.480 回答