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.一下子将数据读取到内存的(无论是文本还是二进制),而不是一行行的读取。 2.异步的IO,创建多线程,或者使用重叠IO,IO复用,异步的事件回调通知机制(可以用事件对象,...
  • Blues1021
  • Blues1021
  • 2015年03月08日 18:18
  • 9446

转:磁盘文件的正常读写与异步读写

在Win32系统下文件可以支持平常的同步读写和异步读写(但在Win9X下,Win32系统不支持磁盘文件的异步读写)。本节在后面部分将会介绍文件的异步读写,最后一段内容将向大家讲解一下文件的区域加锁。 ...
  • jungzhang
  • jungzhang
  • 2010年07月07日 15:56
  • 2046

较大数据文件的读取优化过程续

由来在上一篇博客(见参考1)中写了从基本到优化的过程,但仍然有可以优化的余地,这里记录下。问题文章1中根据固定行字节数优化读取速度有很大的弊端,就是需要解析的文件可能是不规则行长度的。可以有通用的按行...
  • sunnyloves
  • sunnyloves
  • 2016年04月12日 18:39
  • 923

读取磁盘块数据

1.最先想到的就是通过磁盘端口,进行IO操作,于是写了一个汇编代码,编译,运行,结果报segment fault,在网上问了别人,人家说在保护模式下无法直接对端口进行操作。 2.于是想到了调用磁盘驱...
  • henujava
  • henujava
  • 2011年07月31日 07:49
  • 1633

C/C++(5)实现大数据文件的内存映射机制

摘要 本文主要讲述大量数据的文件的内存映射机制的实现。 1. 内存映射 内存映射文件,是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileM...
  • Canhui_WANG
  • Canhui_WANG
  • 2016年09月26日 14:57
  • 938

磁盘和内存读写简单原理

当程序要读取的数据时传入内存地址(行地址+列地址),如果数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,通过柱面号,磁头号,扇区号定位磁盘位置,找到数据的起始位置并向后连续读取一页...
  • zhanghongzheng3213
  • zhanghongzheng3213
  • 2017年01月06日 18:32
  • 3465

用Windows的文件映射机制,实现大批量数据的快速存储

原文:http://blog.csdn.net/tonylk/archive/2006/05/11/725103.aspx上次做的电子相册软件,为了解决大文件读取速度慢的问题,使用了Windows下的...
  • freexploit
  • freexploit
  • 2006年05月12日 12:13
  • 1746

Linux C++内存映射方式读写文件

内存映射就是将磁盘上的文件映射到系统内存中,对内存的修改可以同步到对磁盘文件的修改。可以对大数据文件处理,并且可以提高文件的读写速度。 1 2 3...
  • abcd1f2
  • abcd1f2
  • 2017年01月16日 16:44
  • 1044

主存和磁盘I/O的原理

主存存取原理 目前计算机使用的主存基本都是随机读写存储器(RAM),现代RAM的结构和存取原理比较复杂,这里本文抛却具体差别,抽象出一个十分简单的存取模型来说明RAM的工作原理。 图5 从抽象角度看...
  • abcd1101
  • abcd1101
  • 2017年02月16日 22:49
  • 407

C++采用内存映射方式高效率读写大数据

在有时候,项目的数据量特别大,而且源源不断的到来,这个时候,利用传统的IO文件流写文件势必效率很低跟不上节奏。不妨采用内存映射方式来写文件,达到高效。 我们这里采用mmap这种内存映射方法: 一、mm...
  • oceanperfect
  • oceanperfect
  • 2016年08月12日 16:09
  • 5024
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C/C++快速读写磁盘数据的方法-块读取/异步/优化分析算法/内存文件映射的原理和使用
举报原因:
原因补充:

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