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

时间:2015-06-04 15:09:01

标签: c++ dictionary key-value lookup-tables key-value-store

现在我有一个记录查找表条目的文件。如果条目数量很少,我可以简单地将此文件加载到STL映射中并在我的代码中执行搜索。但如果有很多条目怎么办?如果我以上述方式执行此操作,可能会导致内存不足等错误。我在这里听你的意见......

P.S。我只是想在不将所有条目加载到内存中的情况下执行搜索。

Key-value数据库可以解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您最终必须从硬盘驱动器加载数据,但如果表格很大,则无法通过它进行线性搜索,因此无法放入内存中,因此:

  1. 想想你是否可以将数据拆分成一组文件
  2. 制作一个索引表,显示哪个文件包含哪些条目(比如前100个条目在“file1_100”中,第二个条目在“file101_201”中等等)
  3. 使用步骤2中的索引表找到要加载的文件
  4. 加载文件并进行线性搜索
  5. 对于典型的数据库管理系统来说,这是一个非常简化的方案,因此您可能希望使用MySQL,PostgreSQL,MsSQL,Oracle或其中任何一个系统。 如果这是一个研究项目,那么在完成搜索问题之后,请考虑优化线性操作(通过切换到二分搜索等)和表(真实数据库使用平衡树结构,哈希表等)。

答案 1 :(得分:0)

一种方法是将文件中的数据重组为组。

例如,让我们考虑一个完整的语言词典。通常,字典太大而无法完全读入内存。所以一个想法就是用第一个字母对单词进行分组。

在此示例中,您将首先根据字母阅读相应的组。因此,如果您要搜索的单词以" m"开头,您将加载" m"分组到记忆中。

还有其他分组方法,如word(key)长度。也可以有子组。在这个例子中,你可以划分" m"按字长或第二个字母分组。

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

有很多方法可以在文件上存储组,例如使用"部分"标记。这些将是另一个问题。

这里的想法,包括@ 047,是为了最有效的搜索来构建数据,给你的内存限制。