php内存限制测试

时间:2014-01-16 21:13:50

标签: php memory limit

这似乎是一个未解决的问题:我对本地计算机(来自命令行)的内存限制进行了简单的测试:

<?php
for ($i = 0; $i < 4000*4000; $i ++) {
    $R[$i] = 1.00001;
}
?>

我的内存限制设置为128M。但PHP仍然发送“允许内存耗尽”消息。为什么呢?

1 个答案:

答案 0 :(得分:0)

好吧,我不会说任何未解决的问题。它有几个原因 - 在内存管理方面,PHP语言非常不足 - 这已经不是什么秘密了。现在,您提供的代码可以进行一些优化,但不足以产生影响。例如,在for循环中取乘法并将值存储在变量中。否则,您将在每个循环上执行该数学运算。但是这不会产生任何显着的差异 - 原样是2310451248字节,如果按照我的建议进行操作则是2310451144字节。但问题仍然存在 - PHP不是低级语言,因此您不能指望它具有与C相同的效率。在您的特定情况下,执行所有这些所需的内存略大于2 GB(2.15 gb)

<?php
ini_set('memory_limit', '4096M');
$ii = 4000*4000;
//$R = new SplFixedArray($ii);
$R = array();
for ($i = 0; $i < $ii; $i ++) {
    $R[$i] = 1.00001;
}
echo humanize(memory_get_usage())."\n";

function humanize($size)
{
    $unit=array('b','kb','mb','gb','tb','pb');
    return round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}
?>

但是使用SplFixedArray的事情发生了很大变化:

<?php
ini_set('memory_limit', '4096M');
$ii = 4000*4000;
$R = new SplFixedArray($ii);
for ($i = 0; $i < $ii; $i ++) {
    $R[$i] = 1.00001;
}
echo humanize(memory_get_usage())."\n";

function humanize($size)
{
    $unit=array('b','kb','mb','gb','tb','pb');
    return round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}
?>

这需要“仅”854.72 mb。

这是为什么处理大量数据的公司通常会避免使用PHP并转而使用python等语言的主要原因之一。有一篇很好的文章描述了围绕这个主题的所有问题和原因,here。希望有所帮助。