Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在c+中对文件执行二进制搜索而不将其全部读入内存+;_C++ - Fatal编程技术网

C++ 如何在c+中对文件执行二进制搜索而不将其全部读入内存+;

C++ 如何在c+中对文件执行二进制搜索而不将其全部读入内存+;,c++,C++,我需要一种通过二进制搜索从文件中的特定位置读取数据的方法。这实际上取决于文件中的数据格式。要在文件中执行二进制搜索,需要做到以下几点: 数据记录需要在磁盘文件中按顺序排序 您需要有一个O(1)方法来选择文件中的记录 如果这两个都是真的,那么磁盘上的二进制搜索的工作原理与任何其他二进制搜索完全相同。不同之处在于,在获取记录进行比较时,将通过查找记录在磁盘文件中的正确位置,从磁盘加载记录,然后根据加载的记录进行比较来获取记录 如果采用这种方法,您必须非常注意性能。从磁盘中查找和读取数据的操作要比

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

这实际上取决于文件中的数据格式。要在文件中执行二进制搜索,需要做到以下几点:

  • 数据记录需要在磁盘文件中按顺序排序
  • 您需要有一个O(1)方法来选择文件中的记录
如果这两个都是真的,那么磁盘上的二进制搜索的工作原理与任何其他二进制搜索完全相同。不同之处在于,在获取记录进行比较时,将通过查找记录在磁盘文件中的正确位置,从磁盘加载记录,然后根据加载的记录进行比较来获取记录


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

有两种可能的方法可以实现您想要的功能,而无需将整个文件读入内存。第一个(可能是最健壮/可移植的)是使用定位API:

使用上述两种类方法,您可以在文件中“导航”,而无需将整个内容读入内存

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


其余部分取决于文件中的数据类型以及如何实现二进制搜索。

请重新表述您的问题,我很难说出您的问题是什么。我认为您的意思是“不一次性将整个文件读入内存”。你必须读一读文件,至少读一点,才能知道里面有什么。主题和问题不在一起。请重新表述您的问题。是的,这就是我的意思。阅读只是对其进行排序。那么,问题是“如何进行二进制搜索?”还是“如何从文件中的特定位置读取数据?”。答案当然是“你试过什么?”和“你说了什么?”