想象一下,你有一個整數以下數組:PHP和億陣列寶寶
array(1, 2, 1, 0, 0, 1, 2, 4, 3, 2, [...]);
的整數下去高達一萬個條目;而不是硬編碼,它們已經預先生成並存儲在JSON格式的文件中(大小約爲2MB)。這些整數的順序很重要,我不能每次隨機生成它,因爲它應該是一致的,並且始終在相同索引處具有相同的值。
如果該文件是在PHP讀回之後(例如,使用file_get_contents
+ json_decode
)它從700到900毫秒只是爲了讓數組回來 - 「好的」我想,「它可能是合理的,因爲json_decode
必須分析2百萬字符,讓我們緩存它「。 APC將其緩存在大約68MB的條目中,可能是正常的,zvals很大。 但是從APC返回這個陣列也需要一些好的600ms這在我眼中仍然太多。
編輯:APC的序列化/反序列化來存儲和檢索一百萬個項目數組是一個漫長而沉重的過程。
所以問題:
我應該想到這個等待時間,如果我打算裝入一萬個條目數組,無論數據存儲或方法,在PHP?據我瞭解APC存儲的zval本身,所以從理論上APC檢索它應該是儘可能快所能得到(沒有分析,沒有轉換,無人接盤)爲什麼APC這麼慢看起來很簡單的東西?是否有任何有效的方法來使用PHP在內存中完全加載一百萬個條目數組?假設內存使用率不成問題。
如果我只是根據索引訪問這個數組的切片(例如,將索引15中的數據塊加載到索引76)並且從來沒有將整個數組存儲在內存中(我知道這是一種理智的方法)這樣做,但我想知道所有方面),完整陣列的最有效的數據存儲系統是什麼?顯然不是RDBM;我在想Redis,但我很樂意聽到其他想法。
你試過[SplFixedArray](http://php.net/manual/en/class.splfixedarray.php)嗎? – Buddy 2012-07-28 15:24:05
@Buddy yup,差別不大,可能使用較少的內存,但APC需要的時間相當長。 – Mahn 2012-07-28 15:27:44
如果數字很小並且數組是靜態的,您不能使用單個1Mb字符串對象嗎? – 6502 2012-07-28 15:31:31