如果你想要一個真正的索引數組,使用SplFixedArray。它使用較少的內存。此外,PHP 5.3有一個更好的垃圾收集器。
除此之外,PHP將使用比更精心編寫的C/C++等價物更多的內存。
內存使用1024×1024的整數數組:
- 標準陣列:218756848
- SplFixedArray:92914208
通過memory_get_peak_usage()
$array = new SplFixedArray(1024 * 1024); // array();
for ($i = 0; $i < 1024 * 1024; ++$i)
$array[$i] = 0;
echo memory_get_peak_usage();
注意測量的相同的陣列中使用64位整數的C將是8M。
正如其他人所建議的那樣,您可以將數據打包爲一個字符串。這是較慢,但多更高的內存。如果使用8個值是超級簡單:
$x = str_repeat(chr(0), 1024*1024);
$x[$i] = chr($v & 0xff); // store value $v into $x[$i]
$v = ord($x[$i]); // get value $v from $x[$i]
這裏的記憶將只大約1.5MB(即考慮PHP與眼前這個整數字符串數組整個開銷時)。
爲了好玩,我創建了一個創建1024x1024 8位整數的簡單基準,然後循環一次。打包版本全部使用ArrayAccess
,以便用戶代碼看起來相同。
mem write read
array 218M 0.589s 0.176s
packed array 32.7M 1.85s 1.13s
packed spl array 13.8M 1.91s 1.18s
packed string 1.72M 1.11s 1.08s
打包陣列中使用本機64位整數(只包裝7個字節,以避免處理簽名的數據)和填充柱中使用的ord
和chr
。很明顯,實施細節和計算機規格會影響一些東西,但我希望你能得到類似的結果。
所以,雖然數組速度提高了6倍,但它也使用了125倍的內存作爲下一個最佳選擇:打包字符串。顯然,如果內存不足,速度無關緊要。 (當我在沒有ArrayAccess
類的情況下直接使用打包字符串時,它們只比本機陣列慢3倍。)
簡而言之,總結一下,如果速度有任何問題,我會用純PHP以外的東西來處理這些數據。
數組在PHP中是真正的內存渴望(因爲它們實際上是字典)。如果你可以放棄一些(很多!)的速度,你可以[僞造二進制數組像C](http://stackoverflow.com/questions/5505124/cheating-php-integers/5505643#5505643),也可以用於2D結構我猜。但是,也許你真的想調查[HipHop PHP到C++編譯器](https://github.com/facebook/hiphop-php/wiki/)。 – mario 2011-06-13 21:25:37
PHP中的每個變量都有與之相關的開銷。不僅變量的值必須被存儲,而且變量的名字,類型等等......即使是一個簡單的'$ x [1] = 2;'也有大量額外的東西在其後面。 – 2011-06-13 21:27:53
怎麼樣一個PHP擴展? – Bytemain 2011-06-13 21:32:25