【问题标题】:How are the data structures which are created for making searches fast in a system design actually stored?在系统设计中为快速搜索而创建的数据结构是如何实际存储的?
【发布时间】:2017-07-16 05:34:01
【问题描述】:

假设我正在设计一个像 Yelp 这样的餐厅推荐系统。我需要实现的一些基本内容如下:

  1. 用户应该能够添加/删除/更新地点。
  2. 根据他们的位置(经度/纬度),用户应该能够找到给定半径内的所有附近地点。
  3. 用户应该能够添加关于地点的反馈/评论。反馈可以包含图片、文字和评分。

从存储的角度来看,我决定为每个地方设置 LocationId、纬度、经度、名称、描述和评级等字段。假设每个 LocationId 和纬度和经度大约 8 个字节,如果我为 5 亿个位置设计系统,我会提出 ~ 500 x 10^6 MB 的存储需求。到目前为止,一切顺利。

为了更快地获取位置查询结果,我决定使用四叉树,如图所示,由网格组成,其中每个网格由 500 个位置组成。如果一个网格超过 500 个位置,则将其拆分为另一个网格,每个级别的最大网格数为 4。假设我也创建了四叉树。我不确定在创建 Quatree 之后,在哪里以及如何存储这棵树?

我能想到的一种可能的方法是,我将序列化四叉树,并在一些类似的行上,例如序列化 n 叉树并将其存储在文本文件中。考虑到我在树的节点中保留了 LocationId、经度和纬度详细信息,如果每个字段为 8 个字节,我将需要为每个位置存储 24kb 的数据。对于 500 个这样的位置,我的树的总内存需求约为 24 * 500M = 12 GB。每当我的机器重新启动时,我都会反序列化存储的树并按照服务器的请求执行查询操作。

我发现这种方法的一个问题是,我需要在每隔一段时间后每次更新我的文件,以保留有关位置的最新信息。

谁能建议以其他方式存储 QuadTree 以及我将其存储在哪里?正如我上面建议的那样,我相信有更好的方法来存储 QuadTree。

【问题讨论】:

    标签: yelp quadtree system-design


    【解决方案1】:

    四叉树适用于内存,但在存储数据时,DBMS 通常使用某种 R-Tree,例如 R*Tree 或 Sort-Tile-Recursive R-Trees (STR-Trees)。 R-Trees 经过优化,使得一个节点适合磁盘页面。 STR-Trees 最适合一次性批量加载整个数据,然后提供最佳性能。 R*Trees 更适合您希望添加/移动/删除单个点的场景。

    从性能的角度来看,每个四叉树节点使用少于 500 个条目也可能更好,10 或 50 个呢?

    如果您想玩转不同的空间树,请查看 herehere(全部使用 Java)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 2020-02-12
      • 2019-03-20
      • 1970-01-01
      • 2015-11-10
      相关资源
      最近更新 更多