如何在一个文件上执行二进制搜索,而不是在c++中一次将它全部读入内存

How to perform a binary search on a file without reading it all into memory at once in c++

本文关键字:一次 c++ 内存 全部 文件 一个 执行 搜索 二进制      更新时间:2023-10-16

我需要一种方法,我可以从文件中的特定位置读取数据与二进制搜索。

有两种可能的方法可以在不将整个文件读入内存的情况下实现所需的功能。第一种(可能也是最健壮/可移植的)是使用定位API:

  • std::ifstream::tellg()
  • std::ifstream::seekg()

使用std::ifstream类的上述两种方法,您可以在文件中"导航",而无需将整个内容读入内存。

第二种方法是简单地将文件"映射"到内存中,例如可以用"mmap()"完成。操作系统(及其文件系统驱动程序)将负责分页和读取数据。从应用程序的角度来看,这就像将整个文件读入内存。

剩下的取决于你的文件中有什么类型的数据以及你如何实现你的二进制搜索

这实际上取决于文件中的数据格式。要在文件中进行二进制搜索,需要满足以下条件:

  • 数据记录需要在磁盘文件中排序。
  • 你需要有一个0(1)的方法来选择文件中的记录。

如果这两个都为真,则磁盘上的二进制查找与任何其他二进制查找完全相同。不同之处在于,当您获取记录进行比较时,您将通过查找磁盘文件中记录的适当位置来获取它们,从磁盘加载记录,然后基于您已加载的记录进行比较。

如果采用这种方法,您必须非常注意性能。从磁盘中查找和读取比在内存中执行的任何操作都要慢得多。磁盘缓存可以在很大程度上帮助您,但是无论何时移动磁盘,您都会损失多个数量级的性能。