Redis:以最少的 RAM 使用量识别多次出现的键
Redis: Identifying keys that occur more than once with minimal RAM usage
我正在开发一个应用程序,该应用程序想要分析约 10 亿个 250 字节的密钥,以识别在数据集中出现不止一次的那些密钥的子集。
要注意的是,并不是所有的键都能同时放入主内存,所以我想知道:是否有一种有效的算法或模糊数据结构可以识别可能包含多个值的键?
我目前的计划是使用一种改进的 Bloom 过滤器 - 我对每个键进行哈希处理,然后将该哈希作为指向整数的指针存储在 Redis 中。第一次看到散列时,将其值设置为 1,然后每次看到散列时递增。最后,只有哈希值大于 1 的键才能进入 Redis。有没有更好的方法来识别出现不止一次的键?如果其他人可以提供任何建议,我将不胜感激!
我会尝试蛮力选项。读取整个集合并根据每个密钥的前两个字节将其分成 65536 个不同的文件,如果足够随机,或者如果不是,则根据其散列。 (你实际上可以使用两个以上的字节)。
因此密钥 0a18abad1dea...
进入文件 ./0a/18/0a18.dat
。整个操作大约需要另外 250 GB。
要优化文件 opens/writes,您可能希望在内存中保留 65536 个包含密钥的桶,并定期刷新它们,而不是为每个新密钥执行文件 open/append/close。每 GB 的 RAM 允许每个存储桶有额外的 50 个大小的键。
最后,您将拥有 65536 个文件,每个文件包含(一个 billion/65536)= 15258 个 250 字节的密钥。在这些文件中的每一个上,您 运行 重新排序或唯一性检查。使用多个内核,这再次需要与第二次重新读取整个数据集相同的时间。第二部分也可以卸载到单独的机器上,每台机器管理自己的一组文件。
我正在开发一个应用程序,该应用程序想要分析约 10 亿个 250 字节的密钥,以识别在数据集中出现不止一次的那些密钥的子集。
要注意的是,并不是所有的键都能同时放入主内存,所以我想知道:是否有一种有效的算法或模糊数据结构可以识别可能包含多个值的键?
我目前的计划是使用一种改进的 Bloom 过滤器 - 我对每个键进行哈希处理,然后将该哈希作为指向整数的指针存储在 Redis 中。第一次看到散列时,将其值设置为 1,然后每次看到散列时递增。最后,只有哈希值大于 1 的键才能进入 Redis。有没有更好的方法来识别出现不止一次的键?如果其他人可以提供任何建议,我将不胜感激!
我会尝试蛮力选项。读取整个集合并根据每个密钥的前两个字节将其分成 65536 个不同的文件,如果足够随机,或者如果不是,则根据其散列。 (你实际上可以使用两个以上的字节)。
因此密钥 0a18abad1dea...
进入文件 ./0a/18/0a18.dat
。整个操作大约需要另外 250 GB。
要优化文件 opens/writes,您可能希望在内存中保留 65536 个包含密钥的桶,并定期刷新它们,而不是为每个新密钥执行文件 open/append/close。每 GB 的 RAM 允许每个存储桶有额外的 50 个大小的键。
最后,您将拥有 65536 个文件,每个文件包含(一个 billion/65536)= 15258 个 250 字节的密钥。在这些文件中的每一个上,您 运行 重新排序或唯一性检查。使用多个内核,这再次需要与第二次重新读取整个数据集相同的时间。第二部分也可以卸载到单独的机器上,每台机器管理自己的一组文件。