为大数组使用array_map时为什么内存溢出?

时间:2017-12-28 07:24:49

标签: php arrays array-map

当我测试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个字节)

为什么呢?我到处都有搜索答案。但似乎很少有人有这个问题。 如果有人可以帮助我?谢谢!

3 个答案:

答案 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()函数,它在尝试为正在尝试创建的数组分配内存时抛出错误