C/C++快速读写磁盘数据的方法-块读取/异步/优化分析算法/内存文件映射的原理和使用

转载 2015年07月07日 15:27:23

 快速读写磁盘数据的方法:

1.块读取:一下子将数据读取到内存的(无论是文本还是二进制),而不是一行行的读取。

2.异步的IO,创建多线程,或者使用重叠IO,IO复用,异步的事件回调通知机制(可以用事件对象,信号驱动来实现)。

3.优化分析文件的算法和尽量延后分析,分析算法里面频繁的申请字符串内存和释放字符串内存,尽量用指针解析出来,分析文件的内容可以延期到使用的时候才分析。

如果不注意,不小心 ,读取文件的主要性能消耗将会在这里,所以需要特别高的重视。

4.使用内存文件映射, window是CreateFileMapping,MapViewOfFile,UnmapViewOfFile,CloseHandle;linux是用mmap,munmap,msync,free。

内存文件映射的使用:

  (1)大数据量文件的读取,有效的提高磁盘和内存间数据通信的性能;

  (2)进程间快速的共享内存,实现进程间高效的通信。


内存映射文件性能高于普通IO的原因:

内存文件映射和普通的文件IO都是要通过文件系统和硬盘驱动拷贝数据到内存中,内存文件映射数据越大越快主要是:

(1)实际拷贝数据前,需要建立映射信息,内存文件映射已经提前准备好了映射关系,内核调度好了进程内的内存块,交付给内核进行了预先处理,内存文件映射会消耗掉一些时间

(2)实际拷贝时候,内存文件映射将磁盘数据直接拷贝到用户进程内存空间只进行了一次拷贝,而普通的IO是先将文件拷贝到内核缓存空间,然后才拷贝到用户进程内存空间,进行了两次拷贝。

下面是一个使用普通的fread函数和内存映射文件函数,读取不同大小的磁盘文件的性能分析表:

文件大小(KB)

I/O函数读取时间(ms)

内存映射读取时间(ms)

5.56

      0

47

56

31

47

508

94

47

4597.76

811

47

47820.8

7348

78

209920

31403

218

510976

72977

436

综合:当读写磁盘文件的数据较小(少于1MB)时候,使用内存文件映射和普通IO是差异很小的,所以建议使用普通IO就可以了;当很多文件的大小在几十MB, 几百MB, 或者1GB以上的文件数据需要进行较频繁的访问,或者一开始需要全部加载这些大文件的时候,那么就需要考虑使用内存文件映射了。

相关文章推荐

C\C++对大文件的快速读写(内存映射)

1、 创建文件(CreateFile),如下: HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWOR...

探索C++最快的读取文件的方案

http://www.byvoid.com/blog/fast-readfile/   http://blog.csdn.net/jifengszf/article/details/3886802...
  • yaxf999
  • yaxf999
  • 2012年04月24日 16:37
  • 5936

探寻C++最快的读取文件的方案 C++ IO优化

在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的re...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

boost::filesystem使用手册

对于 I/O 操作较多的程序,这样的不一致就意味着需要进行大量的工程工作才能在平台间移植代码。正是因为这个原因,我们才引入了 BoostFilesystem Library。这个广泛使用的库提供了安全...
  • yacper
  • yacper
  • 2010年02月05日 20:58
  • 14012

基于C#的socket编程的TCP异步实现

一、摘要   本篇博文阐述基于TCP通信协议的异步实现。   二、实验平台   Visual Studio 2010   三、异步通信实现原理及常用方法 3....

C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP)

C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP) (2011-03-24 11:40:16) 转载▼ 标签: 杂谈 分类: C# ...

C/C++快速读写磁盘数据的方法-块读取/异步/优化分析算法/内存文件映射的原理和使用

快速读写磁盘数据的方法: 1.一下子将数据读取到内存的(无论是文本还是二进制),而不是一行行的读取。 2.异步的IO,创建多线程,或者使用重叠IO,IO复用,异步的事件回调通知机制(可以用事件对象,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C/C++快速读写磁盘数据的方法-块读取/异步/优化分析算法/内存文件映射的原理和使用
举报原因:
原因补充:

(最多只允许输入30个字)