如何在查找表上执行搜索而不将其加载到内存中?
How can I perform search on a lookup table without loading it in memory?
现在我有一个记录查找表条目的文件。如果条目数量很少,我可以简单地将该文件加载到STL映射中,然后在代码中执行搜索。但是如果有很多很多项呢?如果我按照上面的方式做,可能会导致内存不足等错误。我是来听你的建议的。
注:我只是想执行搜索,而不将所有条目加载到内存中。
键值数据库能解决这个问题吗?
你最终将不得不从硬盘驱动器加载数据,但可以肯定的是,如果一个表是巨大的,它将无法在内存中进行线性搜索,所以:
- 考虑是否可以将数据分成一组文件
- 创建一个包含条目的文件索引表(假设前100个条目在"file1_100"中,后100个条目在"file101_201"中等等)
- 使用第2步中的索引表找到要加载的文件
- 加载文件并进行线性搜索
对于一个典型的数据库管理系统来说,这是一个非常简单的方案,所以你可能想使用MySQL、PostgreSQL、MsSQL、Oracle或其中任何一个。如果这是一个研究项目,那么在你完成搜索问题之后,考虑优化线性操作(通过切换到二进制搜索之类的东西)和表(真正的数据库使用平衡树结构,哈希表等)。
一种方法是将文件中的数据重新组织成组。
例如,让我们考虑一个完整的语言字典。通常,字典太大,不能完全读入内存。一种方法是按首字母分组。在本例中,您将首先根据字母读入相应的组。因此,如果您要搜索的单词以"m"开头,则将"m"组加载到内存中。
还有其他分组方法,如字(键)长度。也可以有子组。在这个例子中,你可以将"m"组除以单词长度或第二个字母。
分组后,您可能希望将数据写回另一个文件,这样您就不必再修改数据了。
在文件中存储组的方法有很多,比如使用"section"标记。这是另一个问题。
这里的思想,包括来自@047的思想,是为了最有效的搜索构建数据,给你的内存约束。
相关文章:
- 原子加载和存储与内存顺序放宽
- 如何从内存缓冲区加载张量流图
- 我在 IDA 或 dbg 或 olly 上看到的内存是否与我在 RAM 上实时加载的内存相同?
- 从C/C++(Win64)中的内存加载64位DLL
- 对外部函数的调用是否强制从内存加载
- 将使用 4 或 8 个对齐规则将加载处理到内存中
- C++:类如何将自身加载到内存中以递增全局变量?
- 加载字节数组(从内存)到libpng c
- 将内存保存到文件并加载它而不必解析数据?
- 加载时间,遍历时间,不同数据段C/C 的内存使用率
- 急切地加载整个模型以估计张量流的内存消耗
- 延迟加载的 DLL 在内存中彼此相距太远
- 使用 DX11 加载 2D 纹理时内存泄漏
- 如何在单独的线程上加载纹理到主内存并使用它在另一个线程上渲染
- 使用C++原子库,我应该使用什么样的内存顺序进行加载,然后进行比较交换
- 当某些错误可以接受时,顺序加载存储原子的内存顺序应该是什么
- 从内存而不是URL动态加载QML
- sqlite3数据库加载到内存c++并选择perfomance
- 从Magick++图像中加载内存(libharu)中的图像
- 无法从eclipse(C++/CDT)中指定的地址加载内存