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

时间:2012-12-02 13:47:44

标签: c++ file io

我想阅读一个大型文件,其结构类似于以下内容:

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

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

任何帮助将不胜感激。

3 个答案:

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

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

现在开心Tino Didriksen

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

这取决于操作系统。首先,您可能想要使用大缓冲区。见this question。 (这也取决于阅读是否是连续的)。

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