【问题标题】:Suggestions for a database with good support for set operations对集合操作支持良好的数据库的建议
【发布时间】:2011-04-19 17:37:03
【问题描述】:

我正在寻找一个对集合操作(​​更具体地说:联合)有良好支持的数据库。

我想要的是可以存储短字符串集并计算这些集的并集的东西。例如,我想将 A、B 和 C 添加到一个集合中,然后将 D 和 A 添加到另一个集合中,然后得到这些集合的并集的基数 (4),但放大了一百万倍左右。

值是 12 个字符串,集合大小范围从单个元素到数百万。

我已经尝试过 Redis,它在各个方面都很棒,除了我拥有的数据量,它对于基于内存的东西来说很棘手。我尝试过使用 VM 功能,但这使得它使用更多的内存,它更适合大值并且我有小值(所以说 Redis 邮件列表上的乐于助人的人)。不过,陪审团仍未出局,我可能会让它发挥作用。

我还草拟了在关系数据库之上实现它的草图,这可能会起作用,但我要求的是我不必破解工作的东西。 Redis 会是一个很好的答案,但正如我上面提到的,我已经尝试过了。

我当前基于 Redis 的实现或多或少是这样工作的:我解析日志文件,并为每一行提取一个 API 密钥、一个用户 ID,以及一些属性的值,如站点域、时间天等。然后我制定一个看起来有点像这样的键(每行产生许多键,每个属性一个键):

APIKEY:20101001:site_domain:stackoverflow.com

键指向一个集合,我向这个集合添加用户 ID。当我解析完所有日志文件后,我想知道一个属性的唯一用户 ID 总数,因此我向 Redis 询问所有匹配键的并集的基数

APIKEY:*:site_domain:stackoverflow.com

除了 Redis 之外,是否还有一个数据库可以很好地支持这个用例?

【问题讨论】:

  • 这个目标有运气吗?我最近读过关于github.com/ChenHuajun/pg_roaringbitmap 的文章,如果您还没有找到任何东西并且您可以控制自己的数据库。如果您发现了好东西,请分享。

标签: database set redis


【解决方案1】:

听起来您需要像boost::disjoint_set 这样的数据结构,它是一种专门为获取大集合的联合或交集而优化的数据结构。

【讨论】:

  • 你知道使用这个的任何数据库吗?有很多算法可以做到这一点,但这不是问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 2021-11-18
  • 1970-01-01
相关资源
最近更新 更多