如何在一个文件上执行二进制搜索,而不是在c++中一次将它全部读入内存
How to perform a binary search on a file without reading it all into memory at once in c++
我需要一种方法,我可以从文件中的特定位置读取数据与二进制搜索。
有两种可能的方法可以在不将整个文件读入内存的情况下实现所需的功能。第一种(可能也是最健壮/可移植的)是使用定位API:
-
std::ifstream::tellg()
-
std::ifstream::seekg()
使用std::ifstream
类的上述两种方法,您可以在文件中"导航",而无需将整个内容读入内存。
第二种方法是简单地将文件"映射"到内存中,例如可以用"mmap()
"完成。操作系统(及其文件系统驱动程序)将负责分页和读取数据。从应用程序的角度来看,这就像将整个文件读入内存。
剩下的取决于你的文件中有什么类型的数据以及你如何实现你的二进制搜索
这实际上取决于文件中的数据格式。要在文件中进行二进制搜索,需要满足以下条件:
- 数据记录需要在磁盘文件中排序。
- 你需要有一个0(1)的方法来选择文件中的记录。
如果这两个都为真,则磁盘上的二进制查找与任何其他二进制查找完全相同。不同之处在于,当您获取记录进行比较时,您将通过查找磁盘文件中记录的适当位置来获取它们,从磁盘加载记录,然后基于您已加载的记录进行比较。
如果采用这种方法,您必须非常注意性能。从磁盘中查找和读取比在内存中执行的任何操作都要慢得多。磁盘缓存可以在很大程度上帮助您,但是无论何时移动磁盘,您都会损失多个数量级的性能。
相关文章:
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 在C++中一次将矢量值写入多个文件
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么 zlib 放气初始化调用一次不起作用?
- 在一次迭代中从 txt 文件中读取多行
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 高级选择排序 - 在一次迭代中搜索两个元素
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 如何仅使用一次固定<<设置精度(2)?或者至少恢复到默认行为?
- 什么是仅调用一次并调用参数的控制台应用
- 如何确保用户在一行上提示输入一次时输入名字和姓氏?
- (C++)虽然循环一次不起作用,但我引入了多个变量
- 为什么我的信号处理程序只执行一次?
- 如何使用C++一次读取整个二进制文件
- 花括号使循环运行一次?
- 从子菜单返回后,正确的输入至少进入验证循环一次
- 蓝牙插座只能读取一次,为什么?