VC读取大文件之创建文件映射及文件写入效率测试

本文探讨了使用Windows的内存映射API读取大文件的高效性,对比了内存映射与传统read/write方法,解释了内存映射减少数据拷贝次数从而提高效率的原因。通过代码示例展示了大文件API的使用,并进行了缓冲区大小与写文件速度的相关测试,发现在缓冲区大小约为1.7MB时达到最佳写入速率。
摘要由CSDN通过智能技术生成

文件太大,没法一次读取到内存进行操作?Windows提供了内存映射API来读取大文件,与普通文件读取相比,内存映射效率比较高。

从代码层面上看,从硬盘上将文件读入内存,都要经过文件系统进行数据拷贝,并且数据拷贝操作是由文件系统和硬件驱动实现的,理论上来说,拷贝数据的效率是一样的。但是通过内存映射的方法访问硬盘上的文件,效率要比read和write系统调用高,这是为什么呢?原因是read()是系统调用,其中进行了数据拷贝,它首先将文件内容从硬盘拷贝到内核空间的一个缓冲区,如图2中过程1,然后再将这些数据拷贝到用户空间,如图2中过程2,在这个过程中,实际上完成了 两次数据拷贝 ;而mmap()也是系统调用,如前所述,mmap()中没有进行数据拷贝,真正的数据拷贝是在缺页中断处理时进行的,由于mmap()将文件直接映射到用户空间,所以中断处理函数根据这个映射关系,直接将文件从硬盘拷贝到用户空间,只进行了 一次数据拷贝 。因此,内存映射的效率要比read/write效率高。(引用自http://blog.csdn.net/mg0832058/article/d

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
VC 中使用内存映射技术可以显著提高对大文件的读速度。下面是一个简单的示例代码: ```c++ #include <iostream> #include <windows.h> using namespace std; int main() { HANDLE hFile; HANDLE hMapping; LPVOID lpMapping; // 打开文件 hFile = CreateFile("largefile.bin", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { cout << "Failed to open file." << endl; return 1; } // 创建文件映射 hMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL); if (hMapping == NULL) { cout << "Failed to create file mapping." << endl; CloseHandle(hFile); return 1; } // 映射文件到内存 lpMapping = MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (lpMapping == NULL) { cout << "Failed to map file to memory." << endl; CloseHandle(hMapping); CloseHandle(hFile); return 1; } // 读文件 char* pFile = (char*)lpMapping; for (int i = 0; i < 4 * 1024 * 1024 * 1024LL; i++) { pFile[i] = i % 256; } // 解除内存映射 UnmapViewOfFile(lpMapping); // 关闭文件映射文件句柄 CloseHandle(hMapping); CloseHandle(hFile); cout << "Done." << endl; return 0; } ``` 这个示例程序打开一个名为 largefile.bin 的文件,并将其映射到内存中。然后,程序将对文件进行读操作,最后解除内存映射并关闭文件。在这个示例中,我们使用了一个 4GB 的文件进行测试,程序可以在较短的时间内完成读操作,而不会出现内存不足的错误。 需要注意的是,内存映射虽然可以提高文件速度,但也会占用一定的内存空间。因此,在使用内存映射技术时,需要根据实际情况选择合适的文件大小和内存使用量。同时,需要注意内存映射可能会对程序的稳定性产生影响,特别是在进行大量读操作时。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值