如何在查找表上执行搜索而不将其加载到内存中?

How can I perform search on a lookup table without loading it in memory?

本文关键字:加载 内存 查找 搜索 执行      更新时间:2023-10-16

现在我有一个记录查找表条目的文件。如果条目数量很少,我可以简单地将该文件加载到STL映射中,然后在代码中执行搜索。但是如果有很多很多项呢?如果我按照上面的方式做,可能会导致内存不足等错误。我是来听你的建议的。

注:我只是想执行搜索,而不将所有条目加载到内存中。

键值数据库能解决这个问题吗?

你最终将不得不从硬盘驱动器加载数据,但可以肯定的是,如果一个表是巨大的,它将无法在内存中进行线性搜索,所以:

  1. 考虑是否可以将数据分成一组文件
  2. 创建一个包含条目的文件索引表(假设前100个条目在"file1_100"中,后100个条目在"file101_201"中等等)
  3. 使用第2步中的索引表找到要加载的文件
  4. 加载文件并进行线性搜索

对于一个典型的数据库管理系统来说,这是一个非常简单的方案,所以你可能想使用MySQL、PostgreSQL、MsSQL、Oracle或其中任何一个。如果这是一个研究项目,那么在你完成搜索问题之后,考虑优化线性操作(通过切换到二进制搜索之类的东西)和表(真正的数据库使用平衡树结构,哈希表等)。

一种方法是将文件中的数据重新组织成组。

例如,让我们考虑一个完整的语言字典。通常,字典太大,不能完全读入内存。一种方法是按首字母分组。

在本例中,您将首先根据字母读入相应的组。因此,如果您要搜索的单词以"m"开头,则将"m"组加载到内存中。

还有其他分组方法,如字(键)长度。也可以有子组。在这个例子中,你可以将"m"组除以单词长度或第二个字母。

分组后,您可能希望将数据写回另一个文件,这样您就不必再修改数据了。

在文件中存储组的方法有很多,比如使用"section"标记。这是另一个问题。

这里的思想,包括来自@047的思想,是为了最有效的搜索构建数据,给你的内存约束。