1

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

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

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

任何帮助将不胜感激。

4

3 回答 3

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);

然后使用任何操作来读取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

ETC

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

于 2012-12-02T13:52:17.440 回答
2

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

ifstream f;
char buf[4096];
f.rdbuf()->pubsetbuf(buf, sizeof(buf));
于 2012-12-02T14:02:56.850 回答
0

这取决于操作系统。首先,您可能想要使用大缓冲区。看到这个问题。(这也取决于读数是否是连续的)。

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

于 2012-12-02T13:51:41.150 回答