看來,這是一個不斷解決的問題:我做了一個簡單的測試,在我的本地機器的內存限制(命令行):PHP內存限制測試
<?php
for ($i = 0; $i < 4000*4000; $i ++) {
$R[$i] = 1.00001;
}
?>
,我有內存限制設置爲128M 。但PHP仍然發送「允許的內存耗盡」消息。爲什麼?
看來,這是一個不斷解決的問題:我做了一個簡單的測試,在我的本地機器的內存限制(命令行):PHP內存限制測試
<?php
for ($i = 0; $i < 4000*4000; $i ++) {
$R[$i] = 1.00001;
}
?>
,我有內存限制設置爲128M 。但PHP仍然發送「允許的內存耗盡」消息。爲什麼?
那麼我不會說永遠沒有解決的問題。原因有幾個 - 就內存管理而言,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。希望有所幫助。
這是我需要知道的答案。謝謝。 – user3204284
未解決的問題[This](http://nikic.github.io/2011/12/12/How-big-are-PHP-arrays-really-Hint-BIG.html)是一個非常詳細的答案:對於64位PHP,它是144 * 4000 * 4000字節= 2,304,000,000字節,而對於32位PHP則是76 * 4000 * 4000字節= 1,216,000,000字節 –