在系统设计中为快速搜索而创建的数据结构实际上是如何存储的?
How are the data structures which are created for making searches fast in a system design actually stored?
假设我正在设计一个像 Yelp 这样的餐厅推荐系统。我需要实现的一些基本内容如下:
- 用户应该能够 add/delete/update 个地方。
- 鉴于他们的位置 (longitude/latitude),用户应该能够找到给定半径内的所有附近地点。
- 用户应该可以添加 feedback/review 关于一个地方。反馈可以有图片、文字和评分。
从存储的角度来看,我决定为每个地点设置 LocationId、纬度、经度、名称、描述和评级等字段。假设每个 LocationId 和纬度和经度大约有 8 个字节,如果我为 5 亿个位置设计系统,我会提出大约 500 x 10^6 MB 的存储需求。到目前为止,还不错。
为了更快地得到位置查询结果,我决定使用四叉树,如图所示由网格组成,其中每个网格由500个位置组成。如果一个网格超过 500 个位置,它将被拆分成另一个网格,每个级别的最大网格为 4。假设我也创建了四叉树。我不确定在创建 Quatree 之后,where 和 how 我们如何存储这棵树?
我能想到的一种可能的方法是我将序列化四叉树,并在一些类似的行上像我们序列化一个 n-ary 树并将它存储在一个文本文件中。考虑到我在树的节点中保留 LocationId、Longitude 和 Latitude 详细信息,如果每个字段为 8 个字节,我将需要为每个位置存储 24kb 的数据。对于 500 个这样的位置,我的树的总内存需求将是 ~24 * 500M = 12 GB。每当我的机器重新启动时,我都会反序列化存储的树并根据服务器的请求执行查询操作。
我发现这种方法的一个问题是我每次都需要定期更新我的文件,以便保留有关位置的最新信息。
任何人都可以建议还有哪些其他方式可以存储 QuadTree 以及我将在哪里存储它?我相信有更好的方法来存储我上面建议的四叉树。
假设我正在设计一个像 Yelp 这样的餐厅推荐系统。我需要实现的一些基本内容如下:
- 用户应该能够 add/delete/update 个地方。
- 鉴于他们的位置 (longitude/latitude),用户应该能够找到给定半径内的所有附近地点。
- 用户应该可以添加 feedback/review 关于一个地方。反馈可以有图片、文字和评分。
从存储的角度来看,我决定为每个地点设置 LocationId、纬度、经度、名称、描述和评级等字段。假设每个 LocationId 和纬度和经度大约有 8 个字节,如果我为 5 亿个位置设计系统,我会提出大约 500 x 10^6 MB 的存储需求。到目前为止,还不错。
为了更快地得到位置查询结果,我决定使用四叉树,如图所示由网格组成,其中每个网格由500个位置组成。如果一个网格超过 500 个位置,它将被拆分成另一个网格,每个级别的最大网格为 4。假设我也创建了四叉树。我不确定在创建 Quatree 之后,where 和 how 我们如何存储这棵树?
我能想到的一种可能的方法是我将序列化四叉树,并在一些类似的行上像我们序列化一个 n-ary 树并将它存储在一个文本文件中。考虑到我在树的节点中保留 LocationId、Longitude 和 Latitude 详细信息,如果每个字段为 8 个字节,我将需要为每个位置存储 24kb 的数据。对于 500 个这样的位置,我的树的总内存需求将是 ~24 * 500M = 12 GB。每当我的机器重新启动时,我都会反序列化存储的树并根据服务器的请求执行查询操作。
我发现这种方法的一个问题是我每次都需要定期更新我的文件,以便保留有关位置的最新信息。
任何人都可以建议还有哪些其他方式可以存储 QuadTree 以及我将在哪里存储它?我相信有更好的方法来存储我上面建议的四叉树。