2013-02-17 93 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