2014-01-16 91 views
-3

看來,這是一個不斷解決的問題:我做了一個簡單的測試,在我的本地機器的內存限制(命令行):PHP內存限制測試

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

,我有內存限制設置爲128M 。但PHP仍然發送「允許的內存耗盡」消息。爲什麼?

+0

未解決的問題[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字節 –

回答

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。希望有所幫助。

+0

這是我需要知道的答案。謝謝。 – user3204284