2013-02-17 61 views
2

我在Redis中運行實驗來測試大型密鑰的內存使用情況。我加載了16 Million字符串50-60個字符(字節),大致將802 MB在磁盤上轉換爲Redis中的排序集。它 用完(臃腫到)3.12 GB的內存這個排序集。Redis Data Structures使用大量內存

然後我裝16個百萬短字符串(10-12個字符)佔據220 MB的磁盤上的空間 到另一個有序集合仍然用完2.5 GB的RAM。很顯然,磁盤空間使用量的減少量爲 非常高(減少了72%),但Redis排序集仍然使用大型字符串使用的相當大量的內存。

Redis哈希也是這種情況(短字符串佔用了長字符串使用的內存的80%)。 Redis數據結構使用的內存是否僅依賴於數據結構中的元素個數(排序集或散列),而不是每個元素的長度(這很自然地認爲是這樣 - 較短的字符串=>較小的內存)?

這將是巨大的,如果我能理解爲什麼

1600萬的長字符串使用了幾乎相同的空間,16萬個短噸串

有序集合,如果有什麼我可以做的,以減少短字符串 (任何內存優化)佔用的內存?

+0

快速(無回答)分析;數據大小的差異大約是600MB,內存需求的差異大約是600m,因此您添加的字符串數量似乎存在大約2.3GB的非字符串長度相關常數因子。 – 2013-02-17 08:22:10

+0

非字符串長度相關因子似乎並不恆定,它取決於數據結構中非常糟糕的元素數量,因爲它在數據結構變大(元素數量增多)時增長! – 2013-02-17 09:01:52

回答

4

這個問題是類似於此: Redis 10x more memory usage than data

有序集合是Redis的的較少的存儲器高效的數據結構。它是作爲一個字典和一個跳過列表來實現的。這兩種數據結構都包含大量元數據和指針(基於每個項目),其大小高於10,12,50或60個字節。

由於大多數內存由指針,元數據和internal fragmentation使用,因此字符串大小的50個字節差異不會導致全局內存佔用量的顯着差異。當然,更大的差異會導致更大的影響。

要利用內存優化,您需要拆分數據結構(如上述鏈接中所述)。使用散列或集合更容易,並且對於有序集合通常很困難(或根本不可能)。

+0

Redis.conf可以幫助我們改變嗎?像指針數組這樣的元數據字段,redis對象包裝器似乎是可以減少的。 「實際的數據本身(每個數據本身的大小和容量前綴都是8字節)」我們可以優化前綴8字節(因爲我們知道字符串的最大大小爲20字節) – 2013-02-17 09:31:45

+0

編號所有內存優化都在那裏描述:http://redis.io/topics/memory-optimization,它們只在對象很小時纔有意義(即小哈希,小集合,小排序集合等等) – 2013-02-17 18:18:14