首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于top-N geohash的实时多线程max-heap

用于top-N geohash的实时多线程max-heap
EN

Stack Overflow用户
提问于 2015-04-27 18:38:09
回答 1查看 171关注 0票数 2

我们要求在城市的前10个地方保持一个名单,在任何给定的时刻,对我们的餐饮服务的需求都是从那里产生的。这座城市可能有数以万计的地方。如果必须在内存中创建一个近乎实时的(延迟不超过5分钟)数据存储-按位置记录传入需求(地理哈希)-每分钟读取数百个供应商的数据( ajax刷新是每分钟)

我在考虑一个多线程同步的max-heap。这将是一个复杂的解决方案,因为树锁定本身就是一个复杂的实现。

对于在多线程环境中可以读取和更新的最佳内存(可复制主从)数据结构,有什么建议吗?

我们预计每秒10K QPS和100K更新。当我们扩展到其他城市和地区时,我们将需要每个城市实施top-10。

有现成的解决方案吗?

持久化不是必需的,因此没有基于mySQL的解决方案。如果您推荐redis或mongo DB解决方案,请意识到查询不是按键指向的查询,而是top-N查询。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-07-08 02:26:10

如果您正在寻找您所描述的内容,有几种方法可能会很好地工作。有几篇文章描述了可以作为优先级队列工作的并发数据结构;我不是很熟悉here is one option,但它看起来很有前途。您可能还想检查并发跳过列表,这也应该符合您的要求。

如果我对您的问题陈述的解释是正确的,那么您希望根据您收到的点击数来维护前10个位置的列表。如果是这样的话,我会怀疑虽然更新的数量会很大,但两个位置交换位置的次数实际上不会那么多。换句话说,大多数更新实际上不需要数据结构改变形状。因此,您可以考虑使用标准二进制堆,其中每个元素都使用原子比较和设置整数键,并且具有某种锁定系统,仅在需要在堆中添加、移动或删除元素时使用。

考虑到您正在工作的规模,您可能还希望考虑问题的近似解决方案。例如,count-min sketch数据结构是专门为估计数据流中的频繁元素而设计的,而且速度非常快。它可以很容易地被分发,并以类似于我上面描述的方式与优先级队列相关联。有很多很好的实现,如果我没记错的话,这个数据结构实际上是在您所描述的情况下部署的。

希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29893371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档