Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hash 在Redis中相交大型超日志的最佳方法_Hash_Redis_Hashtable_Hyperloglog_Minhash - Fatal编程技术网

Hash 在Redis中相交大型超日志的最佳方法

Hash 在Redis中相交大型超日志的最佳方法,hash,redis,hashtable,hyperloglog,minhash,Hash,Redis,Hashtable,Hyperloglog,Minhash,问题很简单:我需要找到最佳策略,根据Redis的表示实现精确的HyperLogLog联合——这包括在数据结构导出到其他地方使用时处理其稀疏/密集表示 两种策略 有两种策略,其中一种似乎简单得多。我已经查看了实际的Redis源代码,我有一点麻烦(我自己在C语言中不是很大),想知道从精度和效率的角度来看,使用它们的内置结构/例程还是开发自己的结构/例程更好。为了它的价值,我愿意牺牲空间和某种程度上的错误(stdev+-2%),以追求超大集的效率 1.包容原则 到目前为止,这两种方法中最简单的一种——

问题很简单:我需要找到最佳策略,根据Redis的表示实现精确的HyperLogLog联合——这包括在数据结构导出到其他地方使用时处理其稀疏/密集表示

两种策略 有两种策略,其中一种似乎简单得多。我已经查看了实际的Redis源代码,我有一点麻烦(我自己在C语言中不是很大),想知道从精度和效率的角度来看,使用它们的内置结构/例程还是开发自己的结构/例程更好。为了它的价值,我愿意牺牲空间和某种程度上的错误(stdev+-2%),以追求超大集的效率

1.包容原则 到目前为止,这两种方法中最简单的一种——本质上,我将使用无损并集(PFMERGE)结合这一原理来计算重叠的估计值。测试似乎在许多情况下都能可靠地运行,尽管我很难准确地处理效率和准确性(有些情况下会产生20-40%的错误,这在本用例中是不可接受的)

基本上:

aCardinality + bCardinality - intersectionCardinality
或者,在多个集合的情况下

aCardinality + (bCardinality x cCardinality) - intersectionCardinality
在很多情况下似乎都很准确,但我不知道我是否相信它。虽然Redis有许多内置的低基数修饰符,旨在规避已知的HLL问题,但我不知道在大小差异较大的集合中是否仍然存在严重不准确(使用包含/排除)的问题

2.Jaccard索引交叉点/MinHash 这种方式似乎更有趣,但我的一部分感觉它可能在计算上与Redis的一些现有优化重叠(即,我不是从头开始实现自己的HLL算法)

使用这种方法,我将使用带有MinHash算法的随机箱采样(我认为LSH实现不值得这么麻烦)。这将是一个单独的结构,但是通过使用minhash来获取集合的Jaccard索引,您可以有效地将联合基数乘以该索引以获得更精确的计数


问题是,我不是很精通HLL的,虽然我很想深入研究谷歌的论文,但我需要一个可行的实现在短期内。我很可能忽略了Redis现有优化的一些基本考虑,或者是算法本身的一些基本考虑,该算法允许计算成本低、置信限非常宽松的交点估计

因此,我的问题是:


如果我愿意牺牲空间(并在一定程度上牺牲精度),我如何使用redis最有效地获得N个巨大(数十亿)集合的计算上廉价的交点估计值?

请回头阅读本文。可能会回答你的大部分问题。包含原理不可避免地会在大量集合中增加误差裕度。Min Hash方法将是一种可行的方法


有第三种策略来估计作为HyperLogLog草图给出的任意两个集合的交集大小:最大似然估计

有关更多详细信息,请参阅
.

什么是“最佳方法”的标准,我们知道应该提供什么答案?i、 e.你如何决定什么是“最佳答案”?您需要提供一些限制-您可以使用哪些资源来解决此问题?redis是解决您的“匹配”问题的最佳工具吗“redis”要求所有内容都存储在“内存”中。这对于“数十亿”的记录来说可能是“有趣的”。好吧,在这种情况下,“最好的”基本上就是我描述的@Ryan的顺序,空间是不相关的;在给定的偏差范围内,准确度将是下一个牺牲,计算效率是我的首要任务。我也不太确定这是否正确,但我觉得我不想冒险超越内存解决方案,因为我需要访问这些数据并在动态堆栈中执行这些查询--支持的资源基本上是无限的,但是请记住,我不一定需要与N组十亿的精确值相交,只要有一个基于HLL的精确/便宜的基数解决方案,在那里我可以随意相交。。。再说一次,当你有一把锤子的时候……谢谢你的回答,说实话,这“远远超出了我的专业领域”,但这看起来是一个有趣的问题已经构建了这个,实际上:)。那篇论文确实有帮助,但当我换上一个定制的Hash3扩展时,它真的开始飞起来了。保持每分钟@4MM的强烈查询。如果您找到了正确的方式,请为您的问题添加答案。并将其标记为已接受。