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