如何在C++中读取/写入大文件时减少 I/O 磁盘访问次数

How to reduce the number of I/O disk accesses while reading/writing a large file in C++

本文关键字:磁盘 访问 C++ 读取 文件      更新时间:2023-10-16

我想读取一个结构类似于以下内容的大文件:

        John  10  department
        Hello 14   kjezlkjzlkj
        jhfekh 144 lkjzlkjrzlj
        ........

问题是我想在C++中读取此文件时尽量减少对磁盘的 I/O 访问次数。有没有办法访问磁盘上的文件,然后将文件的大部分读取到内存(那 1 个磁盘访问),然后读取文件的第二个大部分(第二次磁盘访问...等等)?

任何帮助将不胜感激。

只需创建一个大的缓冲区并用一次读取填充它。如有必要,请重复此操作。

流(stdio)实现了这一点。您可以使用fopen,然后使用设置缓冲区

编辑

它相当简单

   /* 5MB - Can increase or decrease this to your hearts content */
   #define BUFFER_SIZE 5242880
   char buffer[BUFFER_SIZE];
   file = fopen("filename", "r");
   setbuffer(file, buffer, BUFFER_SIZE);

然后使用任何操作读取fscanffgets等。

编辑

抱歉没有注意到它C++

这是C++的代码

#include <iostream>
#include <fstream>
using namespace std;
...
const int BUFFER_SIZE = 5242880;
filebuf fb;
char buffer[BUFFER_SIZE];
fb.setbuf(buffer, BUFFER_SIZE);
fb.open ("test.txt",ios::in);
istream is(&fb);

然后可以使用int i; is >> i

现在快乐 蒂诺·迪德里克森

在 C++ iostream 中,您可以使用 rdbuf 和 pubsetbuf 增加缓冲区

ifstream f;
char buf[4096];
f.rdbuf()->pubsetbuf(buf, sizeof(buf));

这取决于操作系统。首先,您可能希望使用大型缓冲区。看到这个问题。(这也取决于读数是否是顺序的)。

或者你可以使用较低级别的系统调用,比如Linux或Posix上的mmap。(或者至少,read具有大兆字节大小的缓冲区)。