2011-04-13 43 views
5

我有一個302MB的對象(實際上是一個對象數組)。當我嘗試用memcached緩存它時,它不起作用,無論我給memcached多少內存,顯然是因爲memcached對可以緩存的對象有1MB的限制。 (我可能是錯的最後一部分,我一直沒有找到很好的文檔。)緩存一個302MB對象

有關如何緩存這件事的任何建議嗎?我在Linux上使用PHP/symfony。

+0

這是怎麼回事?這似乎相當巨大! – 2011-04-13 13:32:18

+2

將它緩存在文件系統而不是memcache中,或者單獨緩存陣列中的每個元素 – nos 2011-04-13 13:33:28

+0

緩存和320MB ... whooooooooooooooooooooooop – diEcho 2011-04-13 13:33:37

回答

12

Quoting

15.5.5.4:什麼是一個對象,你可以在內存緩存中存儲的最大尺寸,並且是可配置的?

默認的最大對象大小爲1MB。在memcached 1.4.2及更高版本中,您可以使用-I命令行選項更改對象的最大大小。

對於之前的版本,要增加此大小,必須重新編譯memcached。您可以在源文件中的slabs.c文件中修改POWER_BLOCK的值。

在memcached 1.4.2及更高版本中,可以使用-I命令行選項配置最大支持的對象大小。例如,爲了增加最大對象大小5MB:

$ memcached -I 5m 

然而,增加內存,即使,這不是一個很好的選擇海事組織。一個更好的主意是將對象拆分成更小的部分,然後緩存它的各個部分。

報價Why are items limited to 1 megabyte in size?

簡短的回答:由於內存分配器的算法是如何工作的。

龍答:Memcached的內存存儲引擎(這將是可插拔/在未來的調整...),採用的是地磚的方法來管理內存。內存被分解成不同大小的塊,從最小數量開始,並按階乘上升到最大可能值。

說最小值爲400個字節,並且最大值爲1兆字節,並且階乘是1.20:

板坯1 - 400字節板坯2 - 480字節板3 - 576字節...等

板坯越大,它與前一塊板之間的間隙越大。所以最大值越大,內存存儲效率越低。 Memcached還必須爲存在的每個板坯預分配一些內存,因此設置一個更大的最大值的factorial需要更多的開銷。

還有一些其他原因,你不想這樣做...如果我們談論的是一個網頁,你試圖存儲/負載值那麼大,你可能做錯事。在這個尺寸下,它將花費大量的時間來加載和解壓縮數據結構到內存中,並且您的網站可能不會很好地運行。

如果您確實想要存儲大於1MB的項目,則可以使用編輯好的slabs.c:POWER_BLOCK值重新編譯memcached,或者使用效率低下的malloc/free後端。其他建議包括數據庫,MogileFS等。

-1

有沒有辦法,你應該需要緩存一個對象(或對象數組)的302Mb實例。

沒有看到代碼,我不能建議如何......但必須有一個重構的好方法,以便您在較小規模上進行緩存。

0

你也許可以使用共享內存(但是我會投票反對它)或使用RAM驅動器。

這是爲一個網絡服務器,或者你正在尋找一個共同的緩存多個Web服務器?

當他們說你可能需要另一種方法時,我仍然加入其他人。試着解釋你想要緩存什麼樣的數據。

1

在替代您可以通過編輯迅速改變限制配置文件[/etc/memcached.conf]加:

# Increase limit 
-I 512M 

重新啓動服務後。