2013-08-07 34 views
0

假設您有一個查詢,並且您確切知道將返回多少結果以及每列的長度,例如, 1M記錄int `id`, char(100) `uid`有沒有方法可以估計PHP數組將消耗多少內存?

有沒有辦法事先知道PHP需要爲這個關聯數組分配多少內存?

+0

有趣的閱讀:http://nikic.github.io/2011/12/12/How-big-are-PHP-arrays-really-Hint-BIG.html – Flosculus

+0

取決於PHP的版本,但返回一百萬記錄可能會打破銀行。如果您必須返回一百萬條記錄(特別是您事先知道數字),請考慮使用SPLFixedArray而不是標準的PHP數組;或者考慮處理每條記錄,因爲它被提取 –

+0

如果您希望您的查詢具有如此大的結果集,請僅說「不」。將結果進行流式處理並分塊處理。 – Jon

回答

1

只是不要將1M記錄分配爲關聯數組。只選擇你需要的數據。找出

+2

事實上,PHP實現只是在做這種大量內存浪費,因爲PHP用例不需要同時記錄100萬條記錄lol – Esailija

+0

不是問題的答案。 1M記錄只是一個理論例子。 – Gajus

+1

其實對於一個糟糕的/理論上的問題來說,這是一個很好的答案 –

0

最好的辦法是做這樣的事情:

$numItems = 1000000; 
$bytes = memory_get_usage(); 
$arr = array(); 
$arrBytes = memory_get_usage() - $bytes; 
$arr[] = array('id'=>1,'uid'=>str_repeat("a",100)); 
$itemBytes = memory_get_usage() - $bytes - $arrBytes; 
echo "Total memory usage estimate: ".($arrBytes + ($itemBytes * $numItems)); 

免責聲明:我不完全知道如何準確,這將是,但應該給個大概。這在不同系統(即32位整數對64位整數)和不同編碼(即單字節對多字節)上也會有所不同。

說完這一切後(以及@YourCommonSense註明)。 「百萬項數組消耗多少內存」的答案是「太多」。考慮分頁或類似來減少你需要的項目數量。

相關問題