当我测试array_map()
功能时。有一种非常奇怪的现象。
正常大小数组
$array = range(1, 100000);
echo memory_get_usage();
array_map(function($value) {}, $array);
echo memory_get_usage();
结果
8649024
8649024
显然内存大小相等。
但是对于大阵列
$array = range(1, 10000000);
echo memory_get_usage();
array_map(function($value) {}, $array);
echo memory_get_usage();
结果
84319040
致命错误:允许的内存大小为134217728字节耗尽(尝试过 在第6行的G:\ phpStudy \ WWW \ testSpeed.php中分配36个字节)
为什么呢?我到处都有搜索答案。但似乎很少有人有这个问题。 如果有人可以帮助我?谢谢!
答案 0 :(得分:0)
也许PHP的array_map()
在内部复制数组(84319040 * 2> 134217728)。
你可以使用memory_limit(256*1024*1024)
来提高memory_limit(在php.ini中,或者专门用于此脚本),但我建议您使用
foreach($array as $key => &$value) {
...
}
之类的内容 - 请注意&$value
这里:你可以直接修改该值,PHP不会在内部创建该值的副本。
也很有可能PHP运行它的垃圾收集器而foreach()
循环处于活动状态。
答案 1 :(得分:0)
我第二次测试了。我发现了一个有趣的现象。代码如下:
echo memory_get_usage() . '<br>';
$a = [
range(1, 500000),
range(1, 500000),
range(1, 500000),
];
echo memory_get_usage() . '<br>';
array_map(function ($value) {
echo memory_get_usage() . '<br>';
}, $a);
echo memory_get_usage() . '<br>';
输出如下:
124976
126417184
// $TheSizeOfEachElement = (126417224 - 125032) / 3 = 42097397.3333;
// When I am use array_map. The memory is add, but not equal the size of
each element.
126417856
126417976
126418056
// When array_map finish, the memory size is back before the array_map starts
126417184
答案 2 :(得分:0)
array_map()
将回调函数应用于原始数组中的每个元素。所以函数对数组中的每个元素执行,并尝试为结果分配内存。当内存使用限制(用于执行每个数组元素+数组元素的函数)超过分配的内存时,会发生此错误。
在这个例子中,数组映射不必对内存耗尽做任何事情。它是range()
函数,它在尝试为正在尝试创建的数组分配内存时抛出错误