我正在尝试找到一种将大量字符串映射到整数的方法。我尝试使用数组,发现了一个我不明白的行为。当我按字符串索引数组(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';
答案 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++){
再多一点!
现在让我想一想问题出在哪里......
修改强>
注意到沙子已经移动了。
使用适合手头任务的任何数据结构。