【问题标题】:php memory limit testphp内存限制测试
【发布时间】:2014-02-06 00:31:22
【问题描述】:

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

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

我将内存限制设置为 128M。但是 PHP 仍然会发出“允许内存耗尽”消息。为什么?

【问题讨论】:

  • 未解决的问题? This 是一个非常详细的答案:对于 64 位 PHP,它是 144*4000*4000 字节 = 2,304,000,000 字节,而对于 32 位 PHP,它是 76*4000*4000 字节 = 1,216,000,000 字节

标签: php memory limit


【解决方案1】:

好吧,我不会说永远未解决的问题。有几个原因 - 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。希望对您有所帮助。

【讨论】:

  • 这是我需要知道的答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-02-18
  • 2016-11-23
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多