我有一个包含1300万个浮点数的文件,每个浮点数都有一个关联的整数索引。文件的原始大小为80MB。
我们要传递多个索引以获取浮点数据。唯一的原因,我需要hashmap字段和值,因为List不支持传递多个索引来获取。
将它们存储为Redis中的哈希图,索引为field,float为值。检查内存使用量约为970MB。
存储1300万作为列表正在使用280MB。
我可以使用任何优化吗?
预先感谢
在弹性缓存上运行
答案 0 :(得分:1)
通过创建索引和浮点值的存储桶,您可以做一个真正好的优化。 哈希在内部对内存进行了优化。 因此,假设原始文件中的数据如下所示:
index, float_value
2,3.44
5,6.55
6,7.33
8,34.55
并且您当前已将它们一个索引存储到哈希或列表中的一个浮点值。 您可以优化存储值的过程:
哈希键将是index%1000,子键将是index,值将是浮点值。
here以及更多详细信息:
首先,我们决定以最简单的方式使用Redis: 每个ID,则密钥为媒体ID,其值为 用户ID:
SET媒体:1155315 939 GET媒体:1155315
939但是,在对该解决方案进行原型设计时,我们发现Redis需要大约70 MB的空间来存储1,000,000个密钥。外推到 我们最终需要的300,000,000,它一直在寻找 价值21GB的数据-已经比17GB实例类型大 亚马逊EC2。
我们问了Redis的核心之一,总是乐于助人的Pieter Noordhuis 开发人员的意见,他建议我们使用Redis哈希。散列 Redis是可以在内存中进行编码的字典 有效率的; Redis设置“ hash-zipmap-max-entries”进行配置 哈希仍可以存在的最大条目数 有效编码。我们发现此设置最好在1000左右。任何 更高的命令和HSET命令将导致明显的CPU活动。对于 更多详细信息,您可以签出zipmap源文件。
为利用哈希类型,我们将所有媒体ID存储到 1000个存储桶(我们只需获取ID,除以1000,然后丢弃 余)。那决定了我们属于哪个钥匙;接下来,在 位于该键的哈希值,媒体ID是内部的查找键 哈希,而用户ID是值。一个例子,给定一个媒体ID 1155315之和,则表示它落入了桶1155(1155315/1000 = 1155):
HSET“ mediabucket:1155”“ 1155315”“ 939” HGET“ mediabucket:1155” “ 1155315”
“ 939”的大小差异非常明显;使用我们的1,000,000个密钥原型(编码为1,000个散列,每个散列为1,000个子密钥), Redis仅需要16MB即可存储信息。扩展到300 百万个密钥,总容量不到5GB-实际上,它甚至可以容纳 在Amazon上便宜得多的m1.large实例类型中,大约是 否则我们将需要更大实例的成本。最好的 总而言之,哈希中的查找仍然是O(1),这使它们非常快。
如果您想尝试这些组合,请使用以下脚本 用于运行这些测试的软件可以在GitHub上作为Gist使用(我们也 为了进行比较,在脚本中包含了Memcached,花了大约52MB 一百万个键)