我想读取一个结构类似于以下的大文件:
John 10 department
Hello 14 kjezlkjzlkj
jhfekh 144 lkjzlkjrzlj
........
问题是我想在用 C++ 读取这个文件时尽量减少对磁盘的 I/O 访问次数。有没有办法访问磁盘上的文件,然后将文件的大部分读取到内存(即 1 个磁盘访问),然后读取文件的第二大部分(第二个磁盘访问......等等)?
任何帮助将不胜感激。
只需创建一个大缓冲区并用一次读取填充它。必要时重复。
流(stdio)实现了这一点。您可以使用fopen然后使用setbuffer
编辑
这很简单
/* 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);
然后使用任何操作来读取fscanf等fgets。
编辑
抱歉没有注意到它是 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
ETC
现在快乐蒂诺·迪德里克森
在 C++ iostream 中,您可以使用rdbuf和pubsetbuf增加缓冲区
ifstream f;
char buf[4096];
f.rdbuf()->pubsetbuf(buf, sizeof(buf));
这取决于操作系统。首先,您可能想要使用大缓冲区。看到这个问题。(这也取决于读数是否是连续的)。
或者您可以使用较低级别的系统调用,例如mmap在 Linux 或 Posix 上。(或至少,read具有大兆字节大小的缓冲区)。