我想阅读一个大型文件,其结构类似于以下内容:
John 10 department
Hello 14 kjezlkjzlkj
jhfekh 144 lkjzlkjrzlj
........
问题是我想在C ++中读取此文件时最小化对磁盘的I / O访问次数。有没有办法访问磁盘上的文件,然后将大部分文件读取到内存(即1个磁盘访问),然后读取文件的第二大部分(第二个磁盘访问...等等)?
任何帮助将不胜感激。
答案 0 :(得分:3)
只需创建一个大缓冲区并用一次读取填充它。必要时重复。
流(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
等
现在开心Tino Didriksen
答案 1 :(得分:2)
在C ++ iostream中,您可以使用rdbuf和pubsetbuf增加缓冲区
ifstream f;
char buf[4096];
f.rdbuf()->pubsetbuf(buf, sizeof(buf));
答案 2 :(得分:0)
这取决于操作系统。首先,您可能想要使用大缓冲区。见this question。 (这也取决于阅读是否是连续的)。
或者您可以使用较低级别的系统调用,例如Linux或Posix上的mmap
。 (或至少read
具有大兆字节大小的缓冲区。)