实施快速有效的方法来搜索非常大的数据集中的项目列表的建议/意见

Posted

技术标签:

【中文标题】实施快速有效的方法来搜索非常大的数据集中的项目列表的建议/意见【英文标题】:Suggestions/Opinions for implementing a fast and efficient way to search a list of items in a very large dataset 【发布时间】:2012-03-13 00:37:38 【问题描述】:

请评论和批评这种方法。

场景:我在一个平面文件中有一个大型数据集(2 亿个条目)。数据的形式是 - 一个 10 位数的电话号码,后跟 5-6 个二进制字段。 每周我都会收到一个仅包含数据更改的 Delta 文件。

问题:给定一个项目列表,我需要确定每个项目(将是 10 位数字)是否存在于数据集中。

我计划的方法

将解析数据集并将其放入数据库(在开始时完成 周),如 mysql 或 Postgres。我想要 RDBMS 的原因 第一步是我想要完整的时间序列数据。

然后从这个数据库中生成某种键值存储 支持操作的最新有效数据,以确定是否 每个项目是否存在于数据集中(考虑某种 NOSQL db,就像这里的 Redis 一样针对搜索进行了优化。应该有 持久性和分布式)。 此数据结构将是只读的

查询此键值存储以了解每个项目是否存在 (如果可能,一次匹配一个值列表而不是匹配 一次一件)。想让这个速度很快。 将使用此功能作为 REST API 的后端

旁注:我的首选语言是 Python。

【问题讨论】:

我认为最好解释一下您面临的具体疑问或问题,以适应 Q(和 A)格式。 点了,以后会记住的。 【参考方案1】:

快速查找的一些注意事项:

如果您想一次检查一组数字,您可以使用 Redis SINTER 执行集合交集。 您可能会受益于使用网格结构,方法是将数字范围分布在一些哈希函数上,例如电话号码的第一位(可能有更好的数字,您必须进行试验),例如使用最佳散列时,将每个节点的大小减少到使用 10 个节点时接近 2000 万个条目。 如果您期望重复请求(这很可能),您可以将最后 n 个请求的电话号码缓存在一个较小的集合中,然后先查询那个。

【讨论】:

你可能想看看在 bitset 中存储“有数据”标志:blog.getspool.com/2011/11/29/…

以上是关于实施快速有效的方法来搜索非常大的数据集中的项目列表的建议/意见的主要内容,如果未能解决你的问题,请参考以下文章

如何通过索引从一个非常大的列表中有效地删除元素?

在非常大的文件中快速搜索字符串

如何为一个非常大的 Core Data 数据库创建一个快速搜索机制?

在非常大的数据集中查找重复项 [重复]

检测是不是存在某些东西,然后自动化过程

将许多语句加载到 Jena 数据集中的最有效方法是啥?