关闭

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

1024人阅读 评论(0) 收藏 举报
分类:

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

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以上的文件数据需要进行较频繁的访问,或者一开始需要全部加载这些大文件的时候,那么就需要考虑使用内存文件映射了。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:268301次
    • 积分:4075
    • 等级:
    • 排名:第7580名
    • 原创:108篇
    • 转载:294篇
    • 译文:1篇
    • 评论:20条
    最新评论