如何在C++中读取/写入大文件时减少 I/O 磁盘访问次数
How to reduce the number of I/O disk accesses while reading/writing a large file in C++
我想读取一个结构类似于以下内容的大文件:
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);
然后使用任何操作读取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
等
现在快乐 蒂诺·迪德里克森
在 C++ iostream 中,您可以使用 rdbuf 和 pubsetbuf 增加缓冲区
ifstream f;
char buf[4096];
f.rdbuf()->pubsetbuf(buf, sizeof(buf));
这取决于操作系统。首先,您可能希望使用大型缓冲区。看到这个问题。(这也取决于读数是否是顺序的)。
或者你可以使用较低级别的系统调用,比如Linux或Posix上的mmap
。(或者至少,read
具有大兆字节大小的缓冲区)。
相关文章:
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 防止临时对象文件访问 MSVC 中的磁盘
- 如何在C++中读取/写入大文件时减少 I/O 磁盘访问次数
- 管理磁盘上的许多 GB 数据,直接访问
- 成功写入会导致仅访问磁盘一次
- 如何创建文件路径可以像磁盘一样访问的虚拟文件系统
- CPP 快速访问磁盘上的二进制数据
- 使用 C/C++ 访问 RAW 磁盘
- 锁定互斥锁vs访问磁盘
- 使用 Node.js 直接访问磁盘